编译器能否优化对函数的输出调用,并产生可能的副作用? 如果有这样的C或C++代码:< /P> if (func()) ; if (func()) assert(0);

编译器能否优化对函数的输出调用,并产生可能的副作用? 如果有这样的C或C++代码:< /P> if (func()) ; if (func()) assert(0);,c++,c,C++,C,如果编译器不能确定函数是否有任何副作用,是否可以优化对函数func()的调用 我的问题来源:我有时以如下方式调用断言宏: if (func()) ; if (func()) assert(0); 如果我想确保总是调用func(),并且如果func()返回错误的值,则在调试模式下关联失败。但最近我被警告说,我的代码不能保证函数总是被调用。< P>(这是一个C++答案。请发布一个问题,用于 >编程语言>强>仅< /强>,而不是两个。< /P> 不,可能有副作用的功能无法优化,因为

如果编译器不能确定函数是否有任何副作用,是否可以优化对函数
func()
的调用

我的问题来源:我有时以如下方式调用断言宏:

if (func())
    ;
if (func())
    assert(0);
如果我想确保总是调用
func()
,并且如果
func()
返回错误的值,则在调试模式下关联失败。但最近我被警告说,我的代码不能保证函数总是被调用。

< P>(这是一个C++答案。请发布一个问题,用于<强> >编程语言>强>仅< /强>,而不是两个。< /P>
不,可能有副作用的功能无法优化,因为这样可能会“优化”副作用。由于“副作用”实际上是指“你的程序所做的事情”,因此允许编译器做这样的事情并不是特别有用。这就是为什么标准的“好像”规则阻止了您所说的那种优化。

如果编译器无法证明优化掉对
func
的调用不会改变程序的可观察行为,则不允许进行优化

因此,除非编译器能够证明不调用函数没有明显的效果,否则调用将发生。请注意,编译器有时可能是智能的,因此如果您想确定,请确保函数确实有副作用。(另一方面,如果没有,你也不必在意。)


这被称为。

可以发布
func
的定义?为什么不
assert(!func())
retval=func();断言(!retval)?这是一种可能产生副作用的常见功能。我不想讨论一些特殊的函数。让我们假设函数不是在同一个文件中实现的,因此编译器没有关于函数内部内容的信息。如果不能确定副作用,则不允许对其进行优化。我不理解函数可能无法调用的担忧。@cxw如果
func
确实有副作用,
assert(!func())
是个坏主意。