首页 > 解决方案 > 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 类型有关。

标签: c++

解决方案


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

您会看到它可以毫不费力地使用 GCC 8.1+ 和 Clang 3.4+ 进行编译,但使用旧版本会失败(超时)。他们甚至可以处理SIZE = 1e7您提到的价值。我尝试了一些优化参数(例如,-O3),但它们似乎对此类问题没有影响。所以也许你应该升级你的编译器版本来解决这个特定的问题。


推荐阅读