假设我们有一个宏+一个函数:
#define MY_MACRO (2*64)
int foo(void)
{
return (2 * (MY_MACRO));
}
gcc会在编译时将MY_MACRO
优化为128而不是使计算成为运行时操作吗?并且在返回语句中更进一步,它会以类似的方式将其优化为256吗?
如果是这样,预处理器在可能的优化方面会寻找其他什么东西?
答案 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