самый местный размер, используемый локально - PullRequest
1 голос
/ 29 сентября 2011

с использованием 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-битных компьютеров) ..

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

1 Ответ

3 голосов
/ 29 сентября 2011

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

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

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