Размер оставшегося стека, пока не произойдет переполнение стека - PullRequest
7 голосов
/ 03 декабря 2011

В Linux, используя C, предположим, что у меня есть динамически определяемое n с именем количества элементов, которые я должен хранить в массиве (int my_array[n]) только в течение короткого периода времени, скажем, одного вызова функции, в результате чего вызываемая функция использует только мало памяти (несколько сотен байт).

В основном n мало, несколько десятых. Но иногда n может быть большим, вплоть до 1000 или 1000 000.

Как рассчитать, может ли мой стек хранить n*o + p байтов без переполнения?

По существу: сколько байтов осталось в моем стеке?

Ответы [ 2 ]

4 голосов
/ 03 декабря 2011

Если вы не используете потоки, или если вы знаете, что ваш код выполняется в главном стеке, то

  1. Запись указателя текущего стека при вводе основного
  2. В вашей процедуре,получить текущий предел стека (см. man getrlimit)
  3. Сравнить разницу между указателем текущего стека и указателем, записанным в шаге 1, с пределом из шага 2.

Если вы используете потокии может выполняться в потоке, отличном от main, см. man pthread_getattr_np

4 голосов
/ 03 декабря 2011

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

Но более прагматичный ответ таков: не размещать большие данные в стеке вызовов .

В вашем случае вы могли бы по-разному обработать случай, когда n<100 (и затем распределение в стеке, возможно, через alloca , имеет смысл) и случай, когда n>=100 (тогдавыделите в куче malloc (или calloc) и не забудьте free это).Сделайте порог 100 a #define -d постоянным.

Типичный кадр вызова в стеке вызовов должен быть, на современных ноутбуках или настольных компьютерах, максимум несколько килобайт (ижелательно меньше, если у вас есть рекурсия или темы).Общее пространство стека обычно не более нескольких мегабайт (а иногда и гораздо меньше: внутри ядра стеки обычно составляют 4 Кбайт каждый!).

...