【问题标题】:What will the GCC pre-processor look to optimize?GCC 预处理器会优化什么?
【发布时间】:2017-10-24 20:24:18
【问题描述】:

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

#define MY_MACRO (2*64)

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

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

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

【问题讨论】:

  • 优化器甚至看不到宏。这是一个完全不同的层次
  • @EugeneSh.: 是的,但问题仍然存在于return 2 * (2*64);
  • @YvesDaoust 目前的问题是:预处理器在可能的优化方面会寻找什么其他东西 - 根本没有意义,因为预处理器没有'不做任何优化。 OP 正在寻找的是常量表达式
  • @EugeneSh.: 问题“gcc 会在编译时将 MY_MACRO 优化为等于 128,而不是使计算成为运行时操作吗?”和“更进一步,在 return 语句中,它会以类似的方式将其优化为等于 256 吗?”保持。 gcc 不是预处理器。

标签: c gcc optimization


【解决方案1】:

GCC 预处理器会优化什么?

什么都没有。预处理器不执行优化——它所做的只是扩展宏和#include 指令。

但是,一旦预处理器处理完您的代码,编译器看到的只是:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      gcc -O2 -S foo.c 
      

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

      foo:
      
              mov     r0, #256
              bx      lr
      

      【讨论】:

        猜你喜欢
        • 2016-03-01
        • 2020-07-24
        • 1970-01-01
        • 2014-09-13
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 2019-01-18
        • 1970-01-01
        相关资源
        最近更新 更多