#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) способа убедиться, что у вас есть нужное место в стеке вашего основного потока:
- В начале main скопируйте
argv
во вновь выделенную память. - Затем создайте новый поток с желаемым размером стека и передайте ему копию
argv
. Это приведет к сбою и сообщит об ошибке, если желаемый размер недоступен. - В новом потоке повторите вызов
main
с новымargv
, но с установленным глобальным флагом, чтобы избежать повторения шагов 1/2. pthread_exit
из начального «основного потока» и рассматривайте свой новый поток как «основной поток».