28

众所周知,所有明智的编译器都会优化以下代码:

const int a = 3;
const int b = 42;

if (a == b)
{
    do_something();
}

如果两个常量相同,if则省略并始终调用函数,如果它们不同,则省略整个块。

但是,在某些情况下,不要优化此代码很重要,因为程序本身可以在运行之前进行修改。例如二进制文件位于闪存中,可以被外部程序访问,当然这两个consts的地址是固定的。(在嵌入式中有意义)。

我正在考虑使用#pragma,但这不是 C 标准的一部分。

另一种方法是使用const volatile. 这是否保证适用于所有符合标准的编译器?

4

2 回答 2

23

是的,const volatile int a = 3;完全符合您的要求,并且从 C89 开始符合标准(请参阅 C89 的第 3.5.3 节)。

这个出色的答案详细描述const volatile了在与您类似的情况下使用。

于 2013-04-23T07:28:07.373 回答
6

const volatile应该做到这一点,因为比较需要“读取”两个变量volatile- 并且标准保证读取将被视为具有可观察到的副作用。

因此,它们不能仅仅被优化掉。

我必须问,你要解决什么问题需要这个解决方案?解释问题可能使我们能够提供您可能没有考虑过的建议和解决方案,而这些建议和解决方案不需要这种跳跃。

于 2013-04-23T07:33:23.937 回答