c++ - 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 类型有关。
解决方案
该问题似乎发生在 GCC 7.3(及更早版本)和 Clang 3.3(及更早版本)中。您可以使用 Godbolt 的编译资源管理器轻松测试这些案例,请参阅:https ://godbolt.org/g/1f2WUi
您会看到它可以毫不费力地使用 GCC 8.1+ 和 Clang 3.4+ 进行编译,但使用旧版本会失败(超时)。他们甚至可以处理SIZE = 1e7
您提到的价值。我尝试了一些优化参数(例如,-O3),但它们似乎对此类问题没有影响。所以也许你应该升级你的编译器版本来解决这个特定的问题。
推荐阅读
- node.js - 示例代码在本地机器上完美运行,但不运行 aws-coloud9 IDE 预览浏览器
- sql-server - 如何在 ASP.Net Web API 中调用动态(SELECT)存储过程
- python - 如何在 TensorFlow 中添加 dropout 层?以及如何在 python 3.x 中增加 Numpy 数组?
- image-processing - 模型的输入是否需要梯度?
- java - 如何处理android studio中的“应用程序已停止”问题
- python - 你如何在 PyQt5 中显示和隐藏小部件?
- reactjs - 附加 react-redux 的提供者给了我一个无效的钩子错误
- python - 如何将此多折线图更改为条形图?
- ios - Swift 4 中的 UIButtonClick 上的嵌入式 UITableView 未使用 reloadData() 重新加载
- swift - 通用视图配置器