gpt4 book ai didi

c - if 语句、函数评估和编译器优化

转载 作者:行者123 更新时间:2023-12-04 00:55:28 24 4
gpt4 key购买 nike

只是一个简单的问题,让我免于测试(尽管我确实应该测试一些东西以确保绝对确定):

给定以下 C 代码:

r1 = fun1();
r2 = fun2();

if (r1 && r2)
{
// do something
}

变量 r1r2 没有在代码的任何其他地方使用,if (...) 语句除外。是否会评估这两个功能?我担心编译器可能会通过消除 r1r2 来优化代码,从而使其看起来像这样:

if (fun1() && fun2())
{
// do something
}

在这种情况下,将首先评估 fun1(),如果返回 FALSE,则 fun2()根本不被评估。这不是我想要的,这就是我将其编码为第一个代码段的原因。

我如何保证一个函数总是被求值?我认为这可以通过将它分配给一个变量来完成,但我担心编译器优化,如果它发现这个变量实际上从未在以后的代码中使用过......

我知道这可以通过将 r1r2 声明为 volatile 来实现,但我想知道是否有更优雅的方法解决方案。

非常感谢对此问题的任何评论,谢谢!


编辑:感谢所有回复的人。我刚刚在我的项目中使用了我的第一个代码片段(它是一个基于 ARM Cortex-M7 的嵌入式系统)。编译器似乎没有按照我上面显示的方式优化代码,两者 fun1()fun2() 被评估(因为他们应该)。此外,使用声明为 volatiler1r2 编译代码会产生与 r1r1 完全相同的二进制输出r2 只是普通变量(即,volatile 关键字根本不会改变编译器输出)。这让我放心,第一个代码片段实际上是在处理后面的 if (...) 语句之前评估两个函数的有保证的方法。

最佳答案

假设代码没有表现出任何未定义的行为,编译器只能执行与未优化代码具有相同外部可见行为的优化。

在您的示例中,这两段代码做了两件不同的事情。具体来说,一个总是调用 fun2 而另一个有条件地调用它。所以您不必担心第一段代码会做错事。

关于c - if 语句、函数评估和编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62835007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com