GCC预处理器将如何优化?

时间:2017-10-24 20:24:18

标签: c gcc optimization

假设我们有一个宏+一个函数:

#define MY_MACRO (2*64)

int foo(void)
{
    return (2 * (MY_MACRO));
}

gcc会在编译时将MY_MACRO优化为128而不是使计算成为运行时操作吗?并且在返回语句中更进一步,它会以类似的方式将其优化为256吗?

如果是这样,预处理器在可能的优化方面会寻找其他什么东西?

3 个答案:

答案 0 :(得分:5)

  

GCC预处理器的优化目标是什么?

无。预处理器不执行优化 - 它只是扩展宏和#include指令。

但是,一旦预处理器完成了代码,所有编译器都会看到:

return (2 * ((2*64)));

它当然可以优化到相当于return 256。它既不知道也不关心输入(2*64)是由宏生成的。

答案 1 :(得分:0)

是的,优化器(不是预处理器)应该合并常量。

通过积极优化,它甚至可以将整个函数内联为int常量256。

答案 2 :(得分:0)

gcc的常量值通常是evaluated at compile time,所以是的。

预处理器只是替换文本,优化由编译器完成。

执行哪些优化取决于编译器,优化级别,目标CPU架构以及编译器开发人员采取的许多其他决策。

如果您需要知道,您应该自己检查编译器生成的汇编代码,例如:运行

gcc -O2 -S foo.c 

检查生成的foo.s文件。以下是ARM平台的示例,因为您可以看到没有执行乘法运算:

foo:

        mov     r0, #256
        bx      lr