Недостатки использования больших переменных / массивов в стеке? - PullRequest
5 голосов
/ 31 января 2012

Каковы недостатки, если таковые имеются, определения больших массивов или объектов в стеке? Возьмите следующий пример:

int doStuff() {
   int poolOfObjects[1500];
   // do stuff with the pool
   return 0;
}

Есть ли проблемы с производительностью? Я слышал о проблемах переполнения стека, но я предполагаю, что этот массив недостаточно велик для этого.

Ответы [ 4 ]

11 голосов
/ 31 января 2012

Переполнение стека является проблемой, если

  • массив больше, чем стек потока

  • дерево вызовов очень глубокое, или

  • функция использует рекурсию

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

5 голосов
/ 31 января 2012

Как вы упомянули, переполнение стека является основной проблемой . Даже если ваш конкретный случай не очень велик, подумайте, что произойдет, если функция рекурсивная.

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


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

Кроме этого, распределение стека дешевое и быстрее, чем выделение кучи. На некоторых компиляторах (например, MSVC) использование стека более 4 Кб заставит компилятор генерировать проверку безопасности буфера. (Но его можно отключить.)

1 голос
/ 12 сентября 2013

https://github.com/kennethlaskoski/SubtleBug

Этот код содержит ошибку, которую я называю малозаметной, поскольку бинарный файл работает безупречно в iOS Simulator и стыдно падает на реальном устройстве.Спойлер впереди: то, что происходит на реальном устройстве, - это классическое переполнение стека из-за выделения очень большой переменной.Симулятор использует намного больший стек x86, так что все идет хорошо.http://en.wikipedia.org/wiki/Stack_overflow#Very_large_stack_variables

0 голосов
/ 31 января 2012

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

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