为什么 g++ 用 -std=c++11 编译 <algorithm> 需要更长的时间?

Why does g++ take much longer to compile <algorithm> with -std=c++11?

g++ 版本为 5.3.0.

#include <algorithm>
int main() {
    return 0;
}

测试$时间g++ test.cpp

real    0m0.203s
user    0m0.073s
sys     0m0.031s

测试$时间g++ test.cpp --std=c++11

real    0m0.761s
user    0m0.554s
sys     0m0.130s

多次尝试的结果相似。包含向量 header 时只有轻微的减速(0.03 秒)。

直接的答案是显然还有更多需要编译的内容。使用 -Q -ftime-report GCC 将打印出配置文件统计信息。请记住,左侧的部分不可靠,因为每次您 运行 命令时它都会更改,但总计始终是一致的。对于 C++03 和 C++11 分别为:

Execution times (seconds)
 phase setup             :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall    1189 kB (16%) ggc
 phase parsing           :   0.03 (100%) usr   0.02 (100%) sys   0.06 (100%) wall    6301 kB (83%) ggc
 preprocessing           :   0.01 (33%) usr   0.01 (50%) sys   0.04 (67%) wall     488 kB ( 6%) ggc
 parser (global)         :   0.00 ( 0%) usr   0.01 (50%) sys   0.00 ( 0%) wall    3626 kB (48%) ggc
 parser struct body      :   0.02 (67%) usr   0.00 ( 0%) sys   0.01 (17%) wall     778 kB (10%) ggc
 parser function body    :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 (17%) wall     436 kB ( 6%) ggc
 TOTAL                 :   0.03             0.02             0.06               7558 kB

Execution times (seconds)
 phase setup             :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall    1384 kB (11%) ggc
 phase parsing           :   0.05 (100%) usr   0.03 (100%) sys   0.10 (100%) wall   10953 kB (88%) ggc
 |name lookup            :   0.00 ( 0%) usr   0.01 (33%) sys   0.01 (10%) wall    1301 kB (10%) ggc
 preprocessing           :   0.01 (20%) usr   0.00 ( 0%) sys   0.03 (30%) wall     878 kB ( 7%) ggc
 parser (global)         :   0.01 (20%) usr   0.01 (33%) sys   0.01 (10%) wall    4592 kB (37%) ggc
 parser struct body      :   0.02 (40%) usr   0.00 ( 0%) sys   0.01 (10%) wall    2837 kB (23%) ggc
 parser function body    :   0.01 (20%) usr   0.01 (33%) sys   0.01 (10%) wall     478 kB ( 4%) ggc
 parser inl. meth. body  :   0.00 ( 0%) usr   0.01 (33%) sys   0.03 (30%) wall     937 kB ( 8%) ggc
 symout                  :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 (10%) wall       0 kB ( 0%) ggc
 TOTAL                 :   0.05             0.03             0.10              12490 kB

这是 12490 - 7558 = 4942 KB 的区别,区别不大。现在至于为什么 GCC 5.3.0 中存在如此大的差异,这是一个 QoI 问题,可能已在以后的版本中修复。