我正在做一项处理 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/