Существует ли максимальное ограничение на размер переменной, которая должна быть размещена в стеке? - PullRequest
9 голосов
/ 28 января 2010

я объявил структурную переменную в C размером больше 1024 байт. При запуске Coverity (приложения статического анализатора кода) он сообщает, что эта переменная стека превышает 1024 байта и поэтому является причиной ошибки. Я хотел бы знать, если мне нужно беспокоиться об этом предупреждении? Действительно ли существует максимальный предел для размера одной переменной стека?

спасибо, Che

Ответы [ 7 ]

3 голосов
/ 28 января 2010

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

В Windows размер стека первого потока является свойством исполняемого файла , заданного при связывании , а размер стека потока можно указать при создании потока .

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

2 голосов
/ 28 января 2010

Да. Конечно, это ограничено адресным пространством вашей системы. Он также ограничен объемом пространства, выделенного для стека вашей ОС, который обычно не может быть изменен после запуска вашей программы, но может быть изменен заранее (либо процессом запуска, либо свойствами исполняемого файла). На мой взгляд, максимальный размер стека в моей системе OS X составляет 8 МБ, а в Linux - 10 МБ. В некоторых системах вы можете даже выделить разное количество стека для каждого запускаемого вами потока, хотя это имеет ограниченную полезность. У большинства компиляторов также есть другое ограничение на количество, которое они допускают в одном кадре стека.

На современном настольном компьютере я бы не беспокоился о выделении стека в 1 Кб, если бы функция не была рекурсивной. Если вы пишете встроенный код или код для использования внутри ядра ОС, это будет проблемой. Код в ядре Linux допускается только стеками 64 КБ или меньше, в зависимости от параметров конфигурации.

2 голосов
/ 28 января 2010

Проблема, которую он пытается защитить от вас, заключается в переполнении стека, поскольку из-за различных путей выполнения его очень трудно найти в тестировании. Главным образом по этой причине - считается плохой формой выделять большой объем данных в стеке. Однако вы действительно можете столкнуться с проблемой ралли во встроенной системе.

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

1 голос
/ 28 января 2010

Эта статья довольно интересна относительно размера стека http://www.embedded.com/columns/technicalinsights/47101892?_requestid=27362

Да, это зависит от ОС, а также от других вещей зависит. Извините, что так расплывчато. Вы также можете найти некоторый код в коллекции gcc для проверки размера стека.

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

Не стоит пытаться использовать огромное количество стекового пространства.

Вот ссылка на размер стека gcc по умолчанию: http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt

Кроме того, вы можете указать --stack,xxxxx для настройки размера стека, поэтому лучше предположить, что xxxxx - это небольшое число и придерживаться распределения кучи.

0 голосов
/ 14 июля 2015

Как я уже видел, компилятор C (турбо) обеспечивает максимальный размер 64000 КБ для переменной. Если нам нужен больший размер, он объявляется как «огромный».

0 голосов
/ 28 января 2010

Если ваша функция была вовлечена (прямо или косвенно) в рекурсию, то выделение большого количества в стеке ограничило бы глубину рекурсии и могло бы привести к перегрузке стека. В Windows этот стек резервируется по умолчанию до 1 МБ, хотя вы можете увеличить его статически с помощью команд компоновщика. Стек будет расти по мере использования, но иногда операционная система не может расширить его. Я обсуждаю это чуть подробнее на моем сайте здесь .

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