Struct потребляет слишком много памяти - PullRequest
0 голосов
/ 02 января 2019

Я делаю школьное задание, касающееся Structs в 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];
};

Теперь, когда я запускаю следующий код, он работает нормально, но если я изменяю длину массива стоек на что-то вроде 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 байта, что составляет около 1 МБ.

EDIT:

Я попросил своего инструктора дать разъяснения по этому вопросу. Он сказал мне, что возможно, что моя куча превышена, а не стек , потому что: (цитата)

Стеки имеют дело с вызовами функций, и превышение стека может быть вызвано например, рекурсия, в то время как здесь мы имеем дело с большими данными, так скорее превышение кучи.

Он также сказал мне, что вполне возможно, что мой компьютер просто имеет нижний предел (около 4 МБ), в то время как серверу, на котором проверяется наш код, выделено 1 ГБ для обработки такого большого количества данных.

Не знаю, правда ли это, потому что из того, что я читаю онлайн, и стеку, и куче можно назначать переменные, а стек не зарезервирован исключительно для вызовов функций, но также и для переменных внутри этих функций ...

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Вы используете длительность автоматического хранения здесь.Маловероятно, что ваш компилятор и архитектура позволят использовать более чем 1 Мбайт таких данных.

К счастью, решение тривиально.

Использование 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, если у вас нет веских причин не делать этого.

0 голосов
/ 02 января 2019

Да, у вас закончился стек.

Это особенно верно, потому что вы копируете данные из place1 в shelf1 и то же самое для всех других, все это только для одного элемента.Используйте std::vector вместо статических массивов.

Если вы не можете, потому что это назначение, вы все равно можете использовать new / delete, чтобы использовать кучу вместо стека.

Если нет, скрестите пальцы и попробуйте использовать:

MAG mag1 = {1, {{3, {{2, {{1, {1,2}}}}}}}};

Ужасно, и вы не знаете, какие объекты вы заполняете, но должны работать на современных компиляторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...