Suppose I have a very simple inline function:
void Trace(int i)
{
#ifdef _DEBUG
std::cout << i << std::endl;
#endif
}
现在我使用由另一个耗时函数生成的参数来调用此函数:
Trace(SlowFunc());
在发布模式下,一个合理的编译器是否会优化掉对SlowFunc()
的调用?具体来说,MSVC 是否会这样做?
Suppose I have a very simple inline function:
void Trace(int i)
{
#ifdef _DEBUG
std::cout << i << std::endl;
#endif
}
Trace(SlowFunc());
在发布模式下,一个合理的编译器是否会优化掉对SlowFunc()
的调用?具体来说,MSVC 是否会这样做?
如果SlowFunc()被证明没有副作用,那么才允许进行优化 - 但实际上,长时间运行的函数通常会带有副作用(除非它是某种重型计算数学,但是优化器可能会放弃它)。如果SlowFunc()被证明没有副作用,则可以优化掉此调用。
但我不会依赖它。相反,使用仅在启用DEBUG时计算参数的日志记录解决方案。有几个选项,请告诉我您是否需要一些指针。
SlowFunc()
没有副作用,那么它就不能将其优化掉。 - 463035818_is_not_a_numberSlowFunc()
做了什么。如果它有副作用,那么它可能无法优化掉其调用。 - NathanOliverassert(SlowFunc())
,这在DEBUG模式下运行良好,但在生产环境中assert是无操作的。然而,这不是编译器优化,而是由于assert的定义。 - pm100