Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用什么样的方法来制作样板文件;冷/永不在线“;C+中的错误处理技术+;?_C++_Gcc_Macros - Fatal编程技术网

C++ 用什么样的方法来制作样板文件;冷/永不在线“;C+中的错误处理技术+;?

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())) {

在本文中,描述了一种在gcc中将错误代码移出行的技术,以帮助尽可能优化热路径的大小。这方面的一个例子是:

#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语句中不太可能的(…)是多余的吗?

我们想到了两种方法:

  • 函数包装器方法,以及
  • 基于宏的方法
函数包装器 就设计而言,最好是将此功能包装成一个封装属性和处理的函数。为此,您传递了一个回调,希望将其作为冷处理程序调用(在本例中为lambda)。它可以看起来像这样简单(使用C++11属性而不是
\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看起来不适合优化。