Что ограничивает мое использование стека с точки зрения памяти? - PullRequest
2 голосов
/ 02 ноября 2009

В Windows (или любой другой ОС в этом отношении), что определяет, сколько стека я могу использовать? Само название этого веб-сайта заставляет меня предположить, что можно выйти из стека, поэтому не следует ли помещать в стек большие объемы данных?

Ответы [ 6 ]

3 голосов
/ 02 ноября 2009

В Win32 размер стека по умолчанию составляет 1 МБ, его можно настроить при вызове CreateThread () и в настройках компилятора.

2 голосов
/ 02 ноября 2009

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

Другие SO сообщения об этом

Есть способы изменить размер стека, но я бы не стал с ним связываться!

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

1 голос
/ 03 ноября 2009

В Windows для собственного проекта C / C ++ в Visual Studio размер стека для начального / основного потока задается с помощью параметра /STACK компоновщика («Размер компоновщика / системы / стека» в свойствах проекта среды IDE) и по умолчанию 1 МБ. Это также размер стека потоков по умолчанию для новых потоков, в которых не указано что-то более конкретное.

Для впоследствии порожденных потоков, _beginthread(), _beginthreadex() и CreateThread() все имеют параметр, позволяющий вам указать размер стека для потока, который будет по умолчанию установлен в свойствах компоновщика, если вы передадите ноль .

Подробнее см. http://msdn.microsoft.com/en-us/library/ms686774.aspx.

1 голос
/ 03 ноября 2009

Вы можете установить размер стека для вашего приложения в Visual Studio в

Project->Properties->Linker->System

Хотя и не рекомендуется методика программирования, довольно просто получить количество свободного места в стеке:

CONTEXT                       Context;
memset(&Context, 0, sizeof(Context));
RtlCaptureContext(&Context);

long stackFree = Context.Rsp;
1 голос
/ 02 ноября 2009

Это полностью зависит от ОС и настраивается, в Linux вы можете проверить и изменить его с помощью вызова ulimit в оболочке.

Зависит от того, что вы называете большим, мой текущий стандартный размер стека Debian составляет 8 мегабайт, что достаточно для того, чтобы иметь большие массивы, например, 1Meg.

0 голосов
/ 02 ноября 2009

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

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