在C++中"如果错误然后快速失败"的性能损失?

aka*_*vel 2 c++ performance if-statement

有没有(用C++)两种风格之间的if-else写的任何性能差别,如下(逻辑上等同代码)所示的likely1 == likely2 == true路径(likely1likely2在这里是指作为占位符的一些更详细的情况)?

// Case (1):
if (likely1) {
  Foo();
  if (likely2) {
    Bar();
  } else {
    Alarm(2);
  }
} else {
  Alarm(1);
}
Run Code Online (Sandbox Code Playgroud)

// Case (2):
if (!likely1) {
  Alarm(1);
  return;
}
Foo();
if (!likely2) {
  Alarm(2);
  return;
}
Bar();
Run Code Online (Sandbox Code Playgroud)

我非常感谢有关尽可能多的编译器和平台的信息(但突出显示了gcc/x86).

请注意我对这两种风格的可读性意见感兴趣,也没有任何"过早优化"声明.

编辑:换句话说,我想询问这两种样式是否在某些时候被编译器认为是完全100%等效/透明的(例如,在特定编译器中的某些点上逐位等效的AST) ,如果没有,那么有什么区别?对于任何(对"现代"和gcc)编译器的偏好,你知道.

而且,为了更清楚,我也真的不觉得它会给予我很大的性能提升,而且它通常会过早的优化,但我感兴趣,是否多少可以提高/降低任何东西?

lit*_*adv 6

它在很大程度上取决于编译器和优化设置.如果差异至关重要 - 同时执行两者,并分析程序集或执行基准测试.