從 C 11 遷移到 C 14,我有一個源檔案,它通常在 C 11 模式下編譯約 20 秒,但在 C 14 模式下編譯同一檔案時,編譯時間增加到約 340 秒。這增加了大約 17 倍。生成的目標代碼的大小加倍。
所以澄清我的問題,我想了解什么都在代碼中,為什么編譯器對于需要通過改變相同的代碼,更長的-std=c 11/c 14標志g 。
為了進行公平的比較,在代碼上運行了前處理器(在 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 下快速編譯。
uj5u.com熱心網友回復:
似乎這是一個已知的錯誤,gcc但并沒有太大的吸引力。
您是否嘗試切換到clang ?
PS from comment:洗掉{}后面的storage{}和手動初始化的作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385110.html
