c++ - 结构消耗太多内存

标签 c++ struct

我正在做一项处理 C++ 结构体的学校作业。分配不允许使用 STL 或 new/delete

我代表杂志中的项目。

struct PLACE {
    int itemCount;
    int etiquette[2];
};

struct SHELF {
    int placesCount;
    PLACE places[128];
};

struct RACK {
    int shelvesCount;
    SHELF shelves[128]; 
};

struct MAG {
    int racksCount;
    RACK racks[5];
};

现在,当我运行以下代码时,它工作正常,但如果我将 racks 数组的长度更改为 20 之类的值,我会收到运行时错误(code.exe 已停止工作)。

PLACE place1 = {1, {1,2}};
SHELF shelf1 = {2, {place1}};   
RACK rack1 = {3, {shelf1}};
MAG mag1 = {1, {rack1}};

我似乎超出了某种内存?我认为这不太可能,因为当我计算它时,(当机架长度为 5 时)我只使用 (((12 * 128) + 4) * 128 + 4) * 5 + 4 个字节,大约 1MB。

编辑:

我向我的导师询问了一些关于这方面的说明。他告诉我,有可能超出了我的,而不是堆栈,因为:(引用)

Stack deals with function calls and stack exceeded could be caused by for example recursion, while here we're dealing with large data, so it's rather the heap being exceeded.

他还告诉我,我的计算机可能只有一个下限(大约 4MB),而我们的代码正在检查的服务器已分配 1GB 来处理这么多数据。

虽然不知道这是不是真的,因为根据我在网上阅读的内容,堆栈和堆都可以分配变量,并且堆栈不仅仅保留用于函数调用,还用于这些函数内部的变量...

最佳答案

您在这里使用了很多自动存储时间。您的编译器和体系结构不太可能允许超过 1Mb 的此类内容。

幸运的是,解决方案很简单。

使用 std::vector 代替数组:例如

struct MAG {
    // int racksCount; no need for this if you use a std::vector
    std::vector<RACK> racks;
};

等等。 std::vector 将其大部分有效负载放在动态内存 中,这就是这种方法有效的原因。还有其他 C++ 标准库容器,但一个好的经验法则是使用 std::vector 除非你有充分的理由不这样做。

关于c++ - 结构消耗太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54005218/

相关文章:

更改结构内的数组大小

c++ - 用内部 vector 填充结构 vector 的一种优雅/有效的方法

c++ - 访问 POD 结构数组作为其单个成员的数组是否违反严格别名?

C++ 将字符串 [4] 转换为字符串

c++ - Debug 和 Release 之间的不同结果

c# - 将 C++ 结构体转换为 C# 结构体

c - 从c中的列表中读取函数中的结构

c++ - 动态规划 - 达到给定分数的不同组合的数量

c++ - 以下 C++ 模板程序中的无效语句是什么?

arrays - 如何创建包含大型数组的结构体数组?