История изменений
Исправление
Moisha_Liberman,
(текущая версия)
:
Вроде были какие то опции компиляции задающие размер стека?
При линковке. Например, так:
gcc -Wl,--stack,9437184 -o you_app you_app.c
Пожалуйста, стек в 9 Mb. Можно и через LD_FLAGS определить, но да, это крайне плохое решение.
Про getrlimit() тут, как я погляжу, уже написали, можно в приложении выставить свой размер стека принудительно. Примерно так (man setrlimit()):
#include <sys/resource.h>
int main (int argc, char **argv)
{
const rlim_t my_size = 9 * 1024 * 1024; /* Те же 9Mb */
struct rlimit rl;
int result;
result = getrlimit(RLIMIT_STACK, &rl);
if (result == 0)
{
if (rl.rlim_cur < my_size)
{
rl.rlim_cur = my_size;
result = setrlimit(RLIMIT_STACK, &rl);
if (result != 0)
{
fprintf(stderr, "Error! setrlimit() returned result = %d\n", result);
}
}
}
/* Do something here. */
return 0;
}
Т.е., прямо в main() предупредили систему что Ваша приблуда работает со стеком в 9Mb и дальше просто используйте ф-ю alloca(), забыв о malloc/calloc/new и т.д. и т.п. Выставлять каждый раз заново размер стека не получится, тут нужно сразу прикинуть сколько по максимуму памяти может понадобиться. И, если на пролезет в стек, то просить у системы память под непролазящую в стек порцию данных. Т.е., высегда смотреть на размер приходящих данных – юольше 9M или меньше и, если > 9, то тогда calloc/malloc, всё как обычно.
Дополнительный профит здесь – вызов alloca() не требует очистки памяти по free(). Т.е., получили память в своей ф-ии, вышли из неё, считайте за Вами прибрано. Но и вернуть такой массив из своей ф-ии запросто не получится. А так, в принципе, этот вариант чуть быстрее и чуть экономичнее стандартного выделения памяти в куче, но и несколько менее надёжный.
В общем, тоже вариант так себе.
Исходная версия
Moisha_Liberman,
:
При линковке.
Вроде были какие то опции компиляции задающие размер стека?
При линковке. Например, так:
gcc -Wl,--stack,9437184 -o you_app you_app.c
Пожалуйста, стек в 9 Mb. Можно и через LD_FLAGS определить, но да, это крайне плохое решение.
Про getrlimit() тут, как я погляжу, уже написали, можно в приложении выставить свой размер стека принудительно. Примерно так (man setrlimit()):
#include <sys/resource.h>
int main (int argc, char **argv)
{
const rlim_t my_size = 9 * 1024 * 1024; /* Те же 9Mb */
struct rlimit rl;
int result;
result = getrlimit(RLIMIT_STACK, &rl);
if (result == 0)
{
if (rl.rlim_cur < my_size)
{
rl.rlim_cur = my_size;
result = setrlimit(RLIMIT_STACK, &rl);
if (result != 0)
{
fprintf(stderr, "Error! setrlimit() returned result = %d\n", result);
}
}
}
/* Do something here. */
return 0;
}
Т.е., прямо в main() предупредили систему что Ваша приблуда работает со стеком в 9Mb и дальше просто используйте ф-ю alloca(), забыв о malloc/calloc/new и т.д. и т.п. Дополнительный профит здесь – вызов alloca() не требует очистки памяти по free(). Т.е., получили память в своей ф-ии, вышли из неё, считайте за Вами прибрано. Но и вернуть такой массив из своей ф-ии запросто не получится.
В общем, тоже вариант так себе.