用 C++11 编译比用 C++98 慢吗?
Is compiling with C++11 way slower than with C++98?
我想将我的项目设置从 C++98 切换到 C++11,但由于额外的编译时间,我非常怀疑。
我的(比较大的)项目大约有800个文件,项目是用cmake生成的。在 XCode 中,使用 C++98 设置,它在 i7 4GHz 机器(SSD 硬盘,16GB 内存)上编译大约需要 15 分钟。
切换到 C++11 大约需要 25 分钟(在 Windows 和 Visual Studio 2013 上更糟 - 时间几乎翻倍!)
我不知道,我的项目设置或我的文件一定是完全错误的,因为没有人在谈论 C++11 的额外编译时间。
是的,我正在使用前向声明、pimpl 习语,甚至尝试了双重包含防护,并且由于 C++11,我删除了很多我不再需要的模板内容(因此编译应该更快,但它不是 - 它更慢!)
使用 C++11 编译是否比使用 C++98 慢?为什么没有人谈论这个?
你的问题没有通用的答案,这是一个实现的问题。
一些编译器比其他编译器更快。 Phoronix 声称 Zapcc is faster 比它的竞争对手(但我不知道,我以前从未听说过 zapcc
)。
我猜想,对于 same 编译器,编译 C++11 风格可能比编译 C++03 风格慢(因为 C++11 引入了额外的 "syntax overloading" 和 auto
,以及可能需要额外支持的移动构造函数等功能)
C++11 的编译速度很慢,特别是因为标准头文件(如 <map>
或 <vector>
....)带来了很多 material (在 C++11 中可能比在 C++03 中更多)。
例如下面的e.cc
文件(只有两个标准包含!):
#include <vector>
#include <map>
使用 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,在 Linux/Debian/Sid/x86-64 上。
您可以使用预编译头文件(参见 this),并且您可以考虑使用不太小的翻译单元(例如,让您的 *.cc
文件每个包含几千行,而不是几十行每行)。
由于 cmake
正在为 make
生成 Makefile
-s,您可以尝试使用 make -j
进行并行构建
我想将我的项目设置从 C++98 切换到 C++11,但由于额外的编译时间,我非常怀疑。
我的(比较大的)项目大约有800个文件,项目是用cmake生成的。在 XCode 中,使用 C++98 设置,它在 i7 4GHz 机器(SSD 硬盘,16GB 内存)上编译大约需要 15 分钟。
切换到 C++11 大约需要 25 分钟(在 Windows 和 Visual Studio 2013 上更糟 - 时间几乎翻倍!)
我不知道,我的项目设置或我的文件一定是完全错误的,因为没有人在谈论 C++11 的额外编译时间。
是的,我正在使用前向声明、pimpl 习语,甚至尝试了双重包含防护,并且由于 C++11,我删除了很多我不再需要的模板内容(因此编译应该更快,但它不是 - 它更慢!)
使用 C++11 编译是否比使用 C++98 慢?为什么没有人谈论这个?
你的问题没有通用的答案,这是一个实现的问题。
一些编译器比其他编译器更快。 Phoronix 声称 Zapcc is faster 比它的竞争对手(但我不知道,我以前从未听说过 zapcc
)。
我猜想,对于 same 编译器,编译 C++11 风格可能比编译 C++03 风格慢(因为 C++11 引入了额外的 "syntax overloading" 和 auto
,以及可能需要额外支持的移动构造函数等功能)
C++11 的编译速度很慢,特别是因为标准头文件(如 <map>
或 <vector>
....)带来了很多 material (在 C++11 中可能比在 C++03 中更多)。
例如下面的e.cc
文件(只有两个标准包含!):
#include <vector>
#include <map>
使用 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,在 Linux/Debian/Sid/x86-64 上。
您可以使用预编译头文件(参见 this),并且您可以考虑使用不太小的翻译单元(例如,让您的 *.cc
文件每个包含几千行,而不是几十行每行)。
由于 cmake
正在为 make
生成 Makefile
-s,您可以尝试使用 make -j