【发布时间】:2012-09-07 11:05:50
【问题描述】:
可能每个人都使用某种优化开关(在 gcc 的情况下,最常见的是 -O2 我相信)。
但是 gcc(以及 VS、Clang 等其他编译器)真正在存在这些选项的情况下会做什么?
当然没有明确的答案,因为它很大程度上取决于平台、编译器版本等。 但是,如果可能的话,我想收集一套“经验法则”。 我什么时候应该考虑一些技巧来加速代码,什么时候应该把工作留给编译器?
例如,编译器会走多远(有点人为......) 案例,针对不同的优化级别:
1) sin(3.141592)
// 会在编译时进行评估,还是我应该考虑一个查找表来加快计算速度?
2) int a = 0; a = exp(18), cos(1.57), 2;
// 编译器是否会计算 exp 和 cos,尽管不需要,因为表达式的值等于 2?
3)
for (size_t i = 0; i < 10; ++i) {
int a = 10 + i;
}
// 编译器会跳过整个循环,因为它没有可见的副作用吗?
也许你可以想想其他例子。
【问题讨论】:
-
@LuboAntonov:我认为这是一个完美的问题。他希望客观地回答有关编译器优化的三个问题。除了观察生成的程序集外,没有一个明确的方法可以知道您是否对这一切都很陌生。
-
最好的建议是使用 -S 选项(对于 gcc)将代码编译为汇编语言,然后查看它生成的代码。当然,您需要学习汇编语言的基础知识,但并不难理解。
-
你读过 gcc 的文档吗?它非常详细地解释了 -ON 启用的功能,并且这些选项有时已经在手册页中进行了非常详细的解释。编译器版本和/或编译器编译方式的优化也得到了改善,因此没有人可以预测编译器通常会做什么,您必须查看生成的汇编程序。 gcc.godbolt.org 是一个很好的工具。
-
@Josh 这是一个开放式问题,甚至 OP 也承认每个编译器的答案都会有所不同,征求意见,他想基本上开始一个 wiki 讨论。我认为这涉及到问题在这里结束的所有原因。
-
@MatthieuM。 - 问题过于宽泛:一个完整的答案可能会写满一本书或几本书。
标签: c++ visual-c++ gcc clang