【发布时间】:2021-08-11 05:36:05
【问题描述】:
我有这个代码:
if (false)
{
...code...
}
编译器正在优化发布版本。我意识到它已被删除,因为它永远无法到达,但我希望里面的代码出现在发布版本中(出于某种原因)。
一个简单的解决方案是使条件依赖于编译器不会计算的函数。例如:
if (cos(0.5) == 1)
{
...code...
}
这没有被优化掉,因为编译器不会计算 cos(x)。
但是,我希望这种始终为假的条件尽可能少地执行,因为从未执行的代码块位于性能至关重要的较大代码段中。我知道 cos(x) 是一个可以快速评估的函数,但是我可以使用更快的函数来代替它吗(永远不会被优化掉的函数)?我正在尝试在此测试中花费尽可能少的 CPU 周期。
或者更具体地说,我如何编写一个总是返回 false、编译器无法评估、消耗的 CPU 周期比 cos(x) 少的函数?天真的尝试,例如:
bool alwaysFalse(){return false;}
bool alwaysFalse(){return 1 == 2;}
bool alwaysFalse(){return (1-2) == 3;}
不工作,因为编译器足够聪明,可以找出它们并优化我的代码。
【问题讨论】:
-
构建中没有 C++ 代码,二进制文件中只有机器代码。你是说你希望二进制文件在某些点包含一堆无用的机器代码?
-
ASM 仍然是代码,这就是我所指的,是的。
-
也许你可以用
#pragma optimize对包围alwaysFalse()函数? -
请说明为什么您希望汇编指令仍然存在于发布版本中。你总是要面对编译器在编译时连续解析更多的表达式,所以你真的要问自己为什么不希望这种情况发生。
-
@VladFeinstein 因为我怀疑 OP 试图依赖于不消除死代码的特定副作用,可能是为了防止内存访问重新排序。所请求的解决方案对于该工作来说是错误的工具,因为它正式不是。
标签: c++ function performance visual-c++