C++ 这种错误检查方法在性能上是否成本过高?

C++ 这种错误检查方法在性能上是否成本过高?,c++,optimization,error-handling,C++,Optimization,Error Handling,在我的项目中,通过名为error的类执行错误处理和日志记录。任何可能需要记录错误或警告的函数或对象方法,都将有一个error&error作为最后一个函数参数,如果遇到问题,将调用error::report(…) 例如: float ratioBetweenBounds( float between, float lowerBound, float upperBound,

在我的项目中,通过名为
error
的类执行错误处理和日志记录。任何可能需要记录错误或警告的函数或对象方法,都将有一个
error&error
作为最后一个函数参数,如果遇到问题,将调用
error::report(…)

例如:

float ratioBetweenBounds(  float between, 
                           float lowerBound, 
                           float upperBound, 
                           Error & error)    // <-- 
{
    if(upperBound != lowerBound){
        return (between - lowerBound) / (upperBound - lowerBound);
    }else{
        error.report(Error::DivideByZero, __LINE__, __FILE__, lowerBound); // <--
        return NAN;
    }
}
边界间浮动比率(在,
浮动下边界,
上浮,

Error&Error)/引用通常由编译器作为隐藏指针实现,因此您实际上是在向函数调用添加一个指针参数。对于一个现代处理器来说,每帧5000次调用其实并不算多。继续分析,但我不会担心它,除非它被证明是一个问题。

一个可能相关的优化技巧:

通过使
error.report
成为一个cold函数,您可以使分支成为低成本/免费的。这样,编译器将生成代码,告诉CPU它不太可能被执行。然而,如果它真的这样做的话,它会更贵

// protect it with a macro for other platforms if necessary
#define COLD __attribute__((cold))

static void COLD error() {
  // unlikely error code
}
以下文件(适用于GCC):

寒冷 函数的cold属性用于通知编译器该函数不太可能执行。功能是 针对尺寸而非速度进行了优化,并在许多目标上放置 进入特殊的文本小节,使所有的冷函数 似乎紧密地结合在一起,以改进代码的非冷部分的代码局部性 节目。导致在代码中调用冷函数的路径如下 被分支预测机制标记为不可能。因此 用于标记用于处理不太可能出现的情况的函数,例如 perror,如cold,以改进对热函数的优化 在罕见的情况下有明显的功能


然后,如果您可以使用“免费”异常或其他异常,那么在正常情况下,代码的其余部分根本不需要因为错误检查/报告的存在而受到任何性能影响。

实际上没有“大量引用”这样的东西。评测可以告诉您这种方式与另一种方式相比的成本,但最终您必须决定收益是否大于成本。如果Visual Studio支持,我会使用这些方法,但不幸的是,它们没有什么可与
不太可能的
提示相比的;我想PGO会知道做些类似的事情。(与-fprofile use开关打开时的GCC一样)