C++ 用什么样的方法来制作样板文件;冷/永不在线“;C+中的错误处理技术+;?
在本文中,描述了一种在gcc中将错误代码移出行的技术,以帮助尽可能优化热路径的大小。这方面的一个例子是:C++ 用什么样的方法来制作样板文件;冷/永不在线“;C+中的错误处理技术+;?,c++,gcc,macros,C++,Gcc,Macros,在本文中,描述了一种在gcc中将错误代码移出行的技术,以帮助尽可能优化热路径的大小。这方面的一个例子是: #define unlikely(x) __builtin_expect (!!(x), 0) bool testForTerriblyUnlikelyEdgeCase() { //test for error condition here } void example() { if (unlikely(testForTerriblyUnlikelyEdgeCase())) {
#define unlikely(x) __builtin_expect (!!(x), 0)
bool testForTerriblyUnlikelyEdgeCase() {
//test for error condition here
}
void example() {
if (unlikely(testForTerriblyUnlikelyEdgeCase())) {
[&]() __attribute__((noinline,cold)) {
//error handling code here
}();
}
}
这是一项伟大的技术,但需要大量的样板文件。最好的包装方法是什么,以尽可能减少样板文件?理想情况下,C++14兼容,允许特定于gcc的功能
附加问题:由于lambda被明确标记为cold,if语句中不太可能的(…)是多余的吗?我们想到了两种方法:
- 函数包装器方法,以及
- 基于宏的方法
\uuuuuuuuuuuuuuuuuuuu
语法):
模板
[[gnu::cold][[gnu::noinline]]
无效冷路径(Fn&&Fn)
{
标准:前进(fn)();
}
您还可以扩展此解决方案以利用要测试的条件,例如:
模板
无效冷路径如果(Expr&&Expr,Fn&&Fn)
{
if(不太可能(std::forward(expr))){
冷通道(标准:正向(fn));
}
}
总而言之,您有:
void示例(){
cold_path_if(testForTerriblyUnlikelyEdgeCase(),[&]{
如果您可以使用C++20,那么带有wild capture的-Lambda看起来不适合优化。