DrC*_*Vee 3 c evaluation if-statement volatile compiler-optimization
只是一个简单的问题,为了让我免于测试(虽然我真的应该测试一些东西才能绝对确定):
给定以下 C 代码:
r1 = fun1();
r2 = fun2();
if (r1 && r2)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
变量r1和r2不会在代码中的任何其他地方使用,除了在if (...)语句中。两个函数都会被评估吗?我担心编译器可能会通过消除r1and来优化代码r2,从而使它看起来像这样:
if (fun1() && fun2())
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,fun1()将首先评估,如果返回FALSE,则fun2()根本不会评估。这不是我想要的,这就是我在第一个代码段中对其进行编码的原因。
我怎样才能保证一个函数总是会被评估?我认为这可以通过将它分配给一个变量来完成,但我担心编译器优化,如果它看到这个变量实际上从未在代码中被使用过......
我知道这可以通过声明r1和r2作为volatile,但我想知道是否有更优雅的解决方案。
对这个问题的任何评论都非常感谢,谢谢!
编辑:感谢所有回复的人。我刚刚在我的项目中使用了我的第一个代码片段(它是一个基于 ARM Cortex-M7 的嵌入式系统)。看来,编译器不优化我上述显示方式的代码,既 fun1()和fun2()被评估(如它们应该)。此外,编译代码r1并r2声明为volatile生成与 whenr1和r2只是普通变量完全相同的二进制输出(即,volatile关键字根本不改变编译器输出)。这让我放心,第一个代码片段实际上是在处理后面的语句之前评估两个函数的有保证的方法if (...)。
假设代码没有表现出任何未定义的行为,编译器只能执行与未优化代码具有相同外部可见行为的优化。
在您的示例中,这两段代码做了两件不同的事情。具体来说,一个总是调用fun2而另一个有条件地调用它。所以你不必担心第一段代码做错了。