在我正在开发的ANSI C项目中,我定义了两个宏:PERIOD_IN_MS
和CYCLES_PER_MS
。在实际的句点处理逻辑中,我在每个“周期”和PERIOD_IN_MS * CYCLES_PER_MS
递增的计数器之间进行许多比较。我担心在每次比较中都会重复评估这个算术运算。
有没有人知道这是否属实,或者编译器是否会在编译时评估两个整数文字的乘积而是使用它?
我意识到这个特定的例子可能只会从生成的汇编代码中删除一条指令,但现在我对此感到好奇。
答案 0 :(得分:6)
标准没有强制要求这样做,但任何合理的编译器都会在编译时将这些常量折叠成一个。参见例如http://en.wikipedia.org/wiki/Constant_propagation
如果您想知道是否发生实际,您可以随时查看编译器生成的汇编程序。
答案 1 :(得分:2)
编译器应该(但我相信C不需要)在编译时计算常量表达式。但是,当打开优化时,一个好的编译器几乎肯定会这样做。
答案 2 :(得分:0)
如果您想避免多次评估,可能只是为了加快编译和您的常量适合int
,您可以使用枚举常量强制执行单一评估。
enum { cycles_per_period = PERIOD_IN_MS * CYCLES_PER_MS};