众所周知,以下代码将由所有合理的编译器优化:
const int a = 3;
const int b = 42;
if (a == b)
{
do_something();
}
如果两个常量相同,则省略if
并始终调用函数,如果它们不同,则省略整个块。
但是,在某些情况下,不优化此代码很重要,因为程序本身可以在运行之前进行修改。例如。二进制文件位于闪存中,可由外部程序访问,当然两个const
的地址是固定的。 (在嵌入式中有意义)。
我正在考虑使用#pragma
,但这不是C标准的一部分。
另一种方法是使用const volatile
。这是否可以保证适用于所有符合标准的编译器?
答案 0 :(得分:23)
是的,const volatile int a = 3;
完全符合您的要求,并且符合C89标准(参见C89第3.5.3节)。
This excellent answer详细介绍const volatile
,用于与您类似的情况。
答案 1 :(得分:6)
const volatile
应该这样做,因为比较需要“读取”两个volatile
变量 - 并且标准保证读取将被视为具有可观察的副作用。
因此,他们不能只是被优化掉。
我必须问,你想解决的问题需要这个解决方案吗?解释这个问题可能会让我们提供您可能没有考虑的建议和解决方案,这些建议和解决方案不需要这种跳跃。