编译器是否会优化掉未使用的参数?

6

Suppose I have a very simple inline function:

void Trace(int i)
{
#ifdef _DEBUG
    std::cout << i << std::endl;
#endif
}

现在我使用由另一个耗时函数生成的参数来调用此函数:
Trace(SlowFunc());

在发布模式下,一个合理的编译器是否会优化掉对SlowFunc()的调用?具体来说,MSVC 是否会这样做?


7
如果编译器无法证明SlowFunc()没有副作用,那么它就不能将其优化掉。 - 463035818_is_not_a_number
我认为这取决于 SlowFunc() 做了什么。如果它有副作用,那么它可能无法优化掉其调用。 - NathanOliver
@user463035818 非常好的观点,我应该想到了。 - Mark Ransom
有一些类似的东西被“优化”掉了。在初学者的代码中经常会看到assert(SlowFunc()),这在DEBUG模式下运行良好,但在生产环境中assert是无操作的。然而,这不是编译器优化,而是由于assert的定义。 - pm100
2
是的,MSVC可以做到,但编译器必须能够证明它没有副作用。 - Raymond Chen
显示剩余2条评论
1个回答

8

如果SlowFunc()被证明没有副作用,那么才允许进行优化 - 但实际上,长时间运行的函数通常会带有副作用(除非它是某种重型计算数学,但是优化器可能会放弃它)。如果SlowFunc()被证明没有副作用,则可以优化掉此调用。

但我不会依赖它。相反,使用仅在启用DEBUG时计算参数的日志记录解决方案。有几个选项,请告诉我您是否需要一些指针。


感谢您成为第一个勇敢留下答案而不是评论的人。无需额外帮助,当我想知道是否绝对必要时,我已经完成了编写宏的工作。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接