我正在和朋友讨论一个优化问题,需要一些帮助来追踪这个问题的答案,希望我可以进一步阅读一些官方文档。
有人告诉我,在生产构建设置中编译一个简单程序(即: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
,则代码不会在预处理器级别优化此类操作。
所以,我的问题是双重的:
- 传递给编译器的优化级别会影响预处理器做出的决定吗?
- 例如,GCC 是否会自动执行此类转换,包括在预处理时预先计算逆系数,并将其存储在我的代码的数据段中,以及乘以而不是除以倒数?
谢谢!