По поводу размера стека...Olej писал(а): - вы же не чудовищно огромные структуры туда запихивать собираетесь? ... это в точности то же, что и просто локальные переменные объявлены
- размер стека процесса (потока, точнее говоря) устанавливается при сборке по умолчанию ... но, в принципе, его можно и изменить?
Он для программ пользовательского пространства:
а). выделяется достаточно большим, в отличие, скажем, от ядра Linux, где на стеке сильно экономят
б). выделяется размером в целое число страниц RAM, 4096 для 32 бит архитектуры.
1. Размер выделяемого размера (в kB) можем смотреть, это весьма много (Linux):
Код: Выделить всё
olej@notebook:~$ ulimit -s -S
8192
olej@notebook:~$ ulimit -s -H
unlimited
Но так (ulimit) можно не только проверить, но и изменить размер стека позже запускаемых прграмм.
2. Программно (API) посмотреть и даже переустановить размер стека можно вызовами getrlimit() / setrlimit().
Код: Выделить всё
#include <stdio.h>
#include <sys/resource.h>
int main( void ) {
struct rlimit lim;
if( getrlimit( RLIMIT_STACK, &lim ) != 0 ) {
printf( "ошибка getrlimit: %m" );
return 1;
};
if( lim.rlim_cur != RLIM_INFINITY )
printf( "%d : ", lim.rlim_cur );
else
printf( "INFINITY : " );
if( lim.rlim_max != RLIM_INFINITY )
printf( "%d\n", lim.rlim_max );
else
printf( "INFINITY\n" );
return 0;
}
Код: Выделить всё
olej@notebook:~/2013_WORK/examples.others.DRAFT/stack_size$ ./getss
8388608 : INFINITY
- статически, при сборке GCC (?);
- как-то опциями команды запуска процесса;
- значением переменных окружения (каких?);
4. Как я понимаю (IMHO), в системах с MMU (а это подавляющее большинство), установка размера для стека в 8Mb вовсе не означает, что 8Mb RAM будет действительно зарезервировано и выделено под стек: выделяется какое-то ограниченное количество (1?) страниц (4Kb), а как только стек достигает границы реально выделенного вниз, новая страница физической RAM отображается в эту следующую страницу... Отсюда следуют далеко идущие последствия, то, что при выделении больших объёмов в стеке, затрачиваемое на это время может быть соизмеримо с malloc(), т.к. для распределения страниц RAM на стек потребуется тоже работа с таблицами MMU.
Но с этим нужно разбираться ... и это может радикально сильно зависеть от архитектуры.