Существует ли максимальный предел размеру переменной, которая должна быть выделена на стеке?

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

спасибо, che

9
задан che 27 January 2010 в 19:58
поделиться

5 ответов

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

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

2
ответ дан 3 November 2019 в 03:47
поделиться

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

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

2
ответ дан 3 November 2019 в 03:47
поделиться

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

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

1
ответ дан 3 November 2019 в 03:47
поделиться

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

0
ответ дан 3 November 2019 в 03:47
поделиться

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

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

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

3
ответ дан 3 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

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