Размер оставшегося стека до тех пор, пока не произойдет переполнение стека

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

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

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

В основном: сколько байтов осталось в моем стеке?


person kay    schedule 03.12.2011    source источник
comment
возможный дубликат Проверка доступного размера стека в C   -  person Brendan Long    schedule 03.12.2011
comment
@BrendanLong, я видел этот вопрос, но, поскольку в нем говорится: «Я использую MinGW с GCC 3.4.5 (mingw-special vista r3)», ответы несколько ориентированы на Windows. Мой вопрос ориентирован на Linux / * nix. ;-)   -  person kay    schedule 03.12.2011
comment
почему вы не можете использовать getrusage() и getrlimit()?   -  person sverre    schedule 03.12.2011
comment
@sverre, я буду рад, если вы объясните мне getrusage и getrlimit. На странице руководства getrusage говорится ru_isrss (не поддерживается) Это поле в настоящее время не используется в Linux.   -  person kay    schedule 03.12.2011
comment
@kay - Посмотрите на 4-й ответ на этой странице.   -  person Brendan Long    schedule 03.12.2011
comment
@Brendan Long: 4-й ответ имеет такой же балл, как и два других ответа, и их порядок рандомизирован. Таким образом, четвертый ответ на этой странице не имеет однозначного имени ответа. Пользуетесь ссылкой?   -  person Thanatos    schedule 03.12.2011
comment
stackoverflow.com / questions / 53827 / или stackoverflow.com/questions/53827/   -  person Brendan Long    schedule 04.12.2011


Ответы (2)


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

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

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

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

person Basile Starynkevitch    schedule 03.12.2011
comment
Смешивание calloc и alloca - плохая новость, потому что один инициализирует данные, а другой нет. Это потенциально может привести к странным ошибкам. - person Dave; 04.12.2011
comment
Хорошо, это может быть malloc & alloca. - person Basile Starynkevitch; 04.12.2011

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

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

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

person Employed Russian    schedule 03.12.2011