самый локальный размер, используемый локально

#c #local-variables

#c #локальные переменные

Вопрос:

использование GCC (windows 32, только C, параметры сборки по умолчанию).

какой самый большой размер моего локального стека .. ?

например:

 void myfunc (void)
{
char is_this_too_big_for_a_local_var[64*1024*1024];

somefunc(is_this_too_big_for_a_local_var);
}
  

возможно, из-за какого-то травматического опыта в первые дни моего кодирования я никогда
не пытался использовать более 16 КБ локального хранилища.. (да, привычки
, приобретенные во времена 286-х годов, 16-битные компьютеры)..

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

Ответ №1:

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

Редактировать: вот идея для «переносимого» (для систем POSIX) способа убедиться, что у вас есть нужное место в стеке вашего основного потока:

  1. В начале main скопируйте argv во вновь выделенную память.
  2. Затем создайте новый поток с желаемым размером стека и передайте ему копию argv . Это приведет к сбою и сообщит об ошибке, если желаемый размер недоступен.
  3. В новом потоке повторите вызов main с новым argv , но с установленным глобальным флагом, чтобы избежать повторения шагов 1/2.
  4. pthread_exit из начального «основного потока» и рассматривайте свой новый поток как «основной поток».