C ++编译大型结构时过多的内存使用

时间:2018-07-25 00:44:25

标签: c++

昨天我在编码时发现一些奇怪的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类型有关。

1 个答案:

答案 0 :(得分:1)

该问题似乎发生在GCC 7.3(及更高版本)和Clang 3.3(及更高版本)中。 您可以使用Godbolt的编译浏览器轻松测试这些情况,请参阅:https://godbolt.org/g/1f2WUi

您会看到它可以在GCC 8.1+和Clang 3.4+上轻松编译,但是在较旧的版本中会失败(超时)。他们甚至可以处理您提到的SIZE = 1e7值。我尝试了一些优化参数(例如-O3),但它们似乎对此类问题没有影响。因此,也许您应该升级编译器版本以解决此特定问题。

相关问题