Можно ли динамически изменять размер стека? Как? - PullRequest
4 голосов
/ 12 февраля 2010

Можно ли динамически изменять размер стека в C?

Если да, то как?

Ответы [ 6 ]

3 голосов
/ 12 февраля 2010

Это зависит от используемой ОС.

В Unix / Linux вы можете использовать системный вызов POSIX setrlimit() для ресурса RLIMIT_STACK.

Подробнее см. man setrlimit.

2 голосов
/ 12 февраля 2010

Под динамически вы подразумеваете изменение размера стека во время выполнения кода? AFAIK, это не может быть сделано. Но вы можете установить размер стека до запуска приложения. Вы можете сделать это с помощью команды "ulimit -s" в linux, которая установит размер стека для всех процессов, выполняемых в этой оболочке.

В случае окон, то же самое можно сделать в VC6 для этого проекта, установив размер стека в Свойства проекта-> Параметры ссылки-> Вывод-> Выделение стека-> Резерв. Я не знаю для VC8, но такие опции могут быть доступны.

1 голос
/ 12 февраля 2010

В однопоточной программе под Linux, стек будет расти автоматически, пока не упадет в область памяти. Обычно это куча, а в 32-битных системах это означает, что у вас может быть несколько ГБ стека.

В многопоточной программе это обычно невозможно, так как стек другого потока будет мешать.

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

Это довольно низкоуровневый материал, который в основном контролируется вашей библиотекой C / библиотекой потоков. Возиться на свой страх и риск :))

0 голосов
/ 12 февраля 2010

Нет, это выходит за рамки C.

0 голосов
/ 12 февраля 2010

Как правило, это невозможно сделать надежно, потому что адресное пространство должно быть зарезервировано для стека. Если объекты уже были размещены в куче с адресами в пределах нового желаемого диапазона стека, у вас будут большие проблемы. В системах с меньшим объемом памяти, чем адресное пространство, это возможно, но я сомневаюсь, что вы увидите много систем, которые позволяют это. C не требует и не поддерживает никаких таких механизмов для этого.

0 голосов
/ 12 февраля 2010

Зачем вам это нужно? Это зависит от ОС и не является тем, в который сам C непосредственно вовлечен (хотя определенные компоновщики и среды выполнения имеют различные способы управления конфигурацией таких вещей).

Какая у вас ОС и чего вы пытаетесь достичь?

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