【问题标题】:Is compiling with C++11 way slower than with C++98?用 C++11 编译比用 C++98 慢吗?
【发布时间】:2016-03-14 18:18:41
【问题描述】:

我想将我的项目设置从 C++98 切换到 C++11,但我很怀疑,因为额外的编译时间。

我的(相当大的)项目大约有 800 个文件,该项目是用 cmake 生成的。在具有 C++98 设置的 XCode 中,它在 i7 4GHz 机器(ssd 硬盘,16GB ram)上编译大约需要 15 分钟。

切换到 C++11 大约需要 25 分钟(在装有 Visual Studio 2013 的 Windows 上更糟糕 - 几乎是两倍的时间!)

我不知道,我的项目设置或我的文件一定是完全错误的,因为没有人谈论 C++11 的额外编译时间。

是的,我正在使用前向声明、pimpl 习惯用法,甚至尝试过双重包含保护,并且由于 C++11,我删除了很多我不再需要的模板内容(因此编译应该更快,但它不 - 它更慢!)

使用 C++11 编译是否比使用 C++98 慢?为什么没有人谈论这个?

【问题讨论】:

  • 如果我们曾经得到模块,那有望解决这些问题...
  • @Default:我没有看到任何东西。 gcc 支持旧的概念概念。那又怎样……

标签: c++ c++11 compilation c++98


【解决方案1】:

您的问题没有通用答案,这是一个实施问题。

一些编译器比其他编译器更快。 Phoronix 声称Zapcc is faster 比它的竞争对手要好(但我不知道,我以前从未听说过zapcc)。

我猜想,对于 same 编译器,编译 C++11 样式可能比编译 C++03 样式慢(因为 C++11 引入了额外的“语法重载”和 @ 987654325@,以及可能需要额外支持的移动构造函数等功能)

众所周知,C++11 的编译速度很慢,特别是因为标准头文件(如 <map><vector> ....)带来了大量材料(在 C++11 中可能比在C++03)。

例如,以下e.cc 文件(仅包含两个标准!):

#include <vector>
#include <map>

在 Linux/Debian/Sid/x86-64 上,使用 g++ -std=c++11 -C -E e.cc | wc -l 编译时,我得到 41870 行预处理,使用 g++ -std=c++03 -C -E e.cc | wc -l 编译时,我得到 15598 行,两者都使用 GCC 5.3

您可以使用预编译的标头(请参阅this),并且您可以考虑不要太小翻译单元(例如,让您的*.cc 文件每个包含几千行,而不是每个几十行)。

由于cmake 正在为make 生成Makefile-s,您可以尝试使用make -j 进行并行构建

【讨论】:

  • 你的最后一句话应该以“C++11”开头,还是只是“C++”?就目前而言(C++11),它似乎与其余的答案相矛盾。
  • 如果 C++11 &lt;vector&gt; 比 C++03 &lt;vector&gt; 大,我不会感到惊讶
  • 事实证明,一个“聪明”的预编译头文件确实有助于恢复正常的编译时间。所以荣誉将转到这篇文章。非常感谢! +1
猜你喜欢
  • 1970-01-01
  • 2019-02-18
  • 2012-05-08
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多