昨天我在编码时发现一些奇怪的C ++编译器行为。
此代码使用g ++ 7.2.0在我的计算机上轻松编译:
#include <iostream>
const int SIZE = 1e6;
struct ArrayOfInts
{
int a[SIZE];
} array_of_ints;
int main()
{
std::cout << array_of_ints.a[0];
return 0;
}
但是此代码不同:
#include <iostream>
#include <functional>
const int SIZE = 1e6;
struct ArrayOfPairs
{
std::pair<int, int> a[SIZE];
} array_of_pairs;
int main()
{
std::cout << array_of_pairs.a[0].first;
return 0;
}
编译时间明显更长。在查看任务管理器时,我注意到在编译此代码片段时,“ cc1plus.exe”的内存使用量跃升至约500 MB。昨天,当我将大小设置为1e7时,我的计算机冻结了。
我不明白为什么会这样,因为成对的阵列只需要约4 MB的内存,而编译却需要100倍以上的内存。
我已经在一些在线平台上测试了与我不同的g ++版本,并且它们也花费了很多时间进行编译。
当然,有很多方法可以解决此问题,但是当您在代码中犯了一些错误并且编译时计算机死机时,这种感觉会很烦人。
所以我想问问题的根源是什么?是C ++还是g ++还是我的错?我的猜测是,它与std :: pair不是POD类型有关。
答案 0 :(得分:1)
该问题似乎发生在GCC 7.3(及更高版本)和Clang 3.3(及更高版本)中。 您可以使用Godbolt的编译浏览器轻松测试这些情况,请参阅:https://godbolt.org/g/1f2WUi
您会看到它可以在GCC 8.1+和Clang 3.4+上轻松编译,但是在较旧的版本中会失败(超时)。他们甚至可以处理您提到的SIZE = 1e7
值。我尝试了一些优化参数(例如-O3),但它们似乎对此类问题没有影响。因此,也许您应该升级编译器版本以解决此特定问题。