Когда вы беспокоитесь о размере стека? - PullRequest
13 голосов
/ 16 декабря 2009

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

Ответы [ 19 ]

13 голосов
/ 16 декабря 2009

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

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

... когда и как вы беспокоитесь о размере стека?

Я использую стек по привычке (например, любой объект размером более 512 байт вместо этого выделяется в куче), и я знаю, насколько большой стек (например, около мегабайта по умолчанию), и поэтому знаю, что не нужно об этом беспокоиться.

Существуют ли практические правила для рассуждений о размере стека?

  • Очень большие объекты могут взорвать стек
  • Очень глубокая рекурсия может взорвать стек
  • Размер стека по умолчанию может быть слишком большим (занимать слишком много общей памяти), если потоков много, и если вы работаете на встроенном устройстве с ограниченным объемом памяти, в этом случае вы можете использовать O / S API или опция компоновщика, чтобы уменьшить размер стека на поток.
11 голосов
/ 16 декабря 2009

Вы заботитесь об этом на микроконтроллере, где вам часто приходится явно указывать пространство стека (или вы получаете все, что осталось после того, как ОЗУ используется для статического выделения + любое пространство программы ОЗУ).

7 голосов
/ 16 декабря 2009

Вы начинаете беспокоиться о размере стека, когда

  • кто-то в вашей команде хитро изобретает рекурсивную функцию, которая может продолжаться и продолжаться ...
  • вы создаете фабрику потоков и вдруг нуждаетесь в десятикратном размере стека, который вам нужен (каждый поток требует стека => чем больше потоков, тем меньше свободного места остается для данного размера стека)
6 голосов
/ 16 декабря 2009

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

Если нет, не волнуйтесь, пока ваша программа не вылетит :) Если вы не размещаете серьезно огромные объекты (много десятков КБ), то это никогда не будет проблемой.

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

4 голосов
/ 16 декабря 2009

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

struct S {
   char big[1000000];
};

но использование std :: string или std :: vector устраняет эту проблему.

3 голосов
/ 16 декабря 2009

Когда вы беспокоитесь о размере стека?

Никогда.

Если у вас проблемы с размером стека, это означает, что вы делаете что-то еще неправильно и должны это исправить, а не беспокоиться о размере стека. Для установки:

  • Распределение неоправданно больших структур в стеке - не делайте этого. выделить в кучу.
  • Смехотворно длинная рекурсия. Я имею в виду в порядке рисования изображения и итерации по пикселям с помощью рекурсии. - найди лучший способ сделать это.
3 голосов
/ 16 декабря 2009

мой опыт: когда вы используете рекурсивные функции, заботьтесь о размере стека !!

3 голосов
/ 16 декабря 2009

Разве вы не должны избегать использования стека для выделения больших объектов? Используй кучу, нет?

2 голосов
/ 16 декабря 2009

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

CreateThread по умолчанию выделяет только 0x100000 байт для стека.

2 голосов
/ 16 декабря 2009

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

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