加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:23:38 所属栏目:百科 来源:网络整理
导读:昨天我在编码时发现了一些奇怪的C编译器行为. 这段代码使用g 7.2.0毫不费力地在我的计算机上编译: #include iostreamconst int SIZE = 1e6;struct ArrayOfInts{ int a[SIZE];} array_of_ints;int main(){ std::cout array_of_ints.a[0]; return 0;} 但是这
昨天我在编码时发现了一些奇怪的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还是我或我的错?我的猜测是它与std :: pair不是POD类型有关.

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读