Сбои выделения стека и выделение "кучи" успешно выполняются!! Действительно ли это возможно?

У меня есть следующая часть отрывка

Class Sample
{ Obj_Class1 o1;
  Obj_Class2 o2;};

Но размер Obj_Class1 и Obj_Class2 огромно так, чтобы компилятор показал, что предупреждение "Рассматривает перемещение некоторого пространства к "куче"". Меня попросили заменить Obj_Class1 o1 Obj_Class1* o1 = new Obj_Class1(); Но я чувствую, что там нет смысла вносить это изменение, поскольку выделение "кучи" также перестанет работать, если выделение стека перестанет работать. Я корректен? Или имеет смысл вносить это изменение (кроме подавления предупреждения компилятора).

5
задан Naveen 22 April 2010 в 11:40
поделиться

4 ответа

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

5
ответ дан 18 December 2019 в 14:43
поделиться

В случае Visual Studio каждый поток по умолчанию получает 1 МБ пространства, и если вы попытаетесь выделить больше, вы получите ошибку переполнения стека. Кучи не имеет этого ограничения, и объем памяти, который вы можете выделить, зависит от самого большого непрерывного пространства, доступного в виртуальной памяти вашего процесса. Поэтому неудивительно, что распределение стека не удается, если объекты действительно огромны.

2
ответ дан 18 December 2019 в 14:43
поделиться

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

В вашем примере вам, вероятно, следует разместить в куче весь Sample , а не его элементы:

int main() {
   Sample* sample = new Sample();
}
3
ответ дан 18 December 2019 в 14:43
поделиться

Стек по умолчанию довольно мал: http://msdn.microsoft.com/en-us/library/ms686774 (VS.85) .aspx

Размер по умолчанию для зарезервированной и первоначально выделенной памяти стека указывается в заголовке исполняемого файла. Создание потока или волокна не удается, если недостаточно памяти для резервирования или фиксации запрошенного количества байтов. Размер резервирования стека по умолчанию, используемый компоновщиком, составляет 1 МБ. Чтобы указать другой размер резервирования стека по умолчанию для всех потоков и волокон, используйте оператор STACKSIZE в файле определения модуля (.def). Операционная система округляет указанный размер до ближайшего кратного степени детализации распределения системы (обычно 64 КБ). Чтобы получить гранулярность распределения текущей системы, используйте функцию GetSystemInfo.

3
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: