我正在与朋友讨论优化问题,需要一些帮助来追踪这个问题的答案,并希望我可以进一步阅读一些官方文档。
我被告知在生产构建设置中编译一个简单程序时(即:CCOPTS+=-O4
,没有调试等),以下代码:
#define COEFFICIENT_F (5.0f)
...
...
float f = 1.0f / COEFFICIENT_F;
...将自动优化为类似的东西:
#define COEFFICIENT_F (5.0f)
...
...
#define INV_COEFFICIENT_F (0.2f)
float f = 1.0f * INV_COEFFICIENT_F;
虽然,如果我正在编译调试版本(即:CCOPTS+=-O0 DEBUG=-g
),代码将不会在预处理器级别优化此类操作。
所以,我的问题有两个:
谢谢!
答案 0 :(得分:4)
你的答案是:
没有。预处理按标准中的定义执行,不受任何优化级别的影响。
您所指的优化不是在预处理时执行,而是在从前端到代码生成器的漫长道路上执行。
答案 1 :(得分:1)
这实际上取决于编译器的确切用法和具体情况。在您给出的确切示例中,如果不是1.0f/5.0f = 0.2f
,就必须是非常愚蠢的编译器,就像1.0f*0.2f = 0.2f
一样(好吧,在这两种情况下,结果可能都是0.1999996
或类似的东西。
现在,如果我们有一些编译器在编译过程中无法弄清楚的数据:
float f[] = { 3.1415926f, 1.0f, 9.82f, 1.4142f };
float res[4];
for(int i = 0; i < 4; i++)
res[i] = f[i] / COEFFICIENT_F;
VS
for(int i = 0; i < 4; i++)
res[i] = f[i] * INV_COEFFICIENT_F;
它可能会有所不同(特别是在较低的优化级别,因为优化器不会用其他数学运算替换琐碎的数学运算,直到你达到至少-O2)。
这有多大差异取决于处理器架构。
要找出确切的差异,你必须编写一个小程序并进行测量。 (做的数字大于四个'!)