试图了解从 C++11 到 C++14 编译时间增加的原因
Trying to understand cause of increased compile time going from C++11 to C++14
从 C++11 迁移到 C++14,我有一个源文件通常在 C++11 模式下编译大约 20 秒,但是在 C++14 模式下编译相同的文件时编译时间增加到 ~340s。这是大约 17 倍的增长。生成的目标代码的大小加倍。
所以澄清我的问题,我试图通过更改 g++
的 -std=c++11/c++14
标志来了解代码中的内容以及为什么编译器为相同的代码花费更长的时间。
为了公平比较 运行 预处理器处理代码(在 C++11 模式下)并使用 C++11 和 C++14 标志编译输出。例如,
g++ -E -std=c++11 -g -O2 -o spaghetti.E spaghetti.cpp
g++ -c -std=c++11 -g -O2 -o spaghetti-11.o -x c++ spaghetti.E
g++ -c -std=c++14 -g -O2 -o spaghetti-14.o -x c++ spaghetti.E
有问题的文件确实有很多固定大小的模板形式的对象数组,例如
template<typename T, std::size_t N>
struct Object {
std::array<T,N> storage{};
std::vector<T> counters;
};
涉及 Object
的符号在使用 C++14 而不是 C++11(以及其他)编译时会加倍。
那么,是什么促使编译器花费 17 倍的时间来编译同一个文件?
应该改变什么来减少这种情况?
我应该注意,如果我更改 Object
实现
template<typename T, std::size_t N>
struct Object {
std::vector<T> storage{}; // was std::array above, N used in other members
std::vector<T> counters;
};
在C++11和C++14下都能快速编译。
这似乎是 gcc
中的 known bug,但没有得到太多关注。
您是否尝试切换到 clang++
?
PS 来自评论:删除 storage{}
后面的 {}
并手动初始化工作。
从 C++11 迁移到 C++14,我有一个源文件通常在 C++11 模式下编译大约 20 秒,但是在 C++14 模式下编译相同的文件时编译时间增加到 ~340s。这是大约 17 倍的增长。生成的目标代码的大小加倍。
所以澄清我的问题,我试图通过更改 g++
的 -std=c++11/c++14
标志来了解代码中的内容以及为什么编译器为相同的代码花费更长的时间。
为了公平比较 运行 预处理器处理代码(在 C++11 模式下)并使用 C++11 和 C++14 标志编译输出。例如,
g++ -E -std=c++11 -g -O2 -o spaghetti.E spaghetti.cpp
g++ -c -std=c++11 -g -O2 -o spaghetti-11.o -x c++ spaghetti.E
g++ -c -std=c++14 -g -O2 -o spaghetti-14.o -x c++ spaghetti.E
有问题的文件确实有很多固定大小的模板形式的对象数组,例如
template<typename T, std::size_t N>
struct Object {
std::array<T,N> storage{};
std::vector<T> counters;
};
涉及 Object
的符号在使用 C++14 而不是 C++11(以及其他)编译时会加倍。
那么,是什么促使编译器花费 17 倍的时间来编译同一个文件? 应该改变什么来减少这种情况?
我应该注意,如果我更改 Object
实现
template<typename T, std::size_t N>
struct Object {
std::vector<T> storage{}; // was std::array above, N used in other members
std::vector<T> counters;
};
在C++11和C++14下都能快速编译。
这似乎是 gcc
中的 known bug,但没有得到太多关注。
您是否尝试切换到 clang++
?
PS 来自评论:删除 storage{}
后面的 {}
并手动初始化工作。