В опциях ld нашел--stack reserve
--stack reserve,commit
Specify the number of bytes of memory to reserve (and optionally commit) to be used as stack for this program. The default is 2Mb reserved, 4K committed. [This option is specific to the i386 PE targeted port of the linker]Компилирую
gcc -Wl,--stack=0x1000000 -o t.cgi t.c
/usr/bin/ld: unrecognized option '--stack=0x1000000'Программа использует сложную и глубокую рекурсию, потому размер стека очень важен.
Как быть?
>[This option is specific to
>the i386 PE targeted port of the linker]Учимся читать. i386 PE --- это под виндовс.
>Программа использует сложную и глубокую рекурсию, потому размер стека очень важен.
>Как быть?Не использовать системный стек. Завести структуру данных типа stack и работать с ней соответствующим образом.
>Учимся читать. i386 PE --- это под виндовс.Не знал этого. Только второй день С под Unix изучаю.
>>Программа использует сложную и глубокую рекурсию, потому размер стека очень важен.
>>Как быть?
>
>Не использовать системный стек. Завести структуру данных типа stack и работать с
>ней соответствующим образом.На форуме я нашел тему про память, в которой добрые люди советовали использовать функцию setrlimit(). Стек через RLIMIT_STACK увеличил до 120-130 Мб. Больше пока не получается.
>Стек через RLIMIT_STACK увеличил до 120-130 Мб. Больше
>пока не получается.Наверно потому, что нет больше виртуальной памяти (адресов свободных).
С другой стороны 120 мегабайт стека, это очень, очень много.
>Наверно потому, что нет больше виртуальной памяти (адресов свободных).В куче я могу выделить в несколько раз больше.
И по 1Гб выделял. Здесь я честно ограничен только объемом виртуальной памяти.>С другой стороны 120 мегабайт стека, это очень, очень много.
Хочется все. :) Экспериментировал с sigaltstack(), толку не было.
Видимо, там нужно использовать в связке sigaction(), а это мудрено.Если хватать не будет, проще, по совету gaa, приспособить для стека кучу.
А если и этого не хватит, то придется решать мою NP-задачу простым перебором.
А это очень, очень долго. :)Всем спасибо.
>Экспериментировал с sigaltstack(), толку не было.
>Видимо, там нужно использовать в связке sigaction(), а это мудрено.Это же про обработчики сигналов.
Смотрите pthread_attr_setstack(), если уж очень хочется стек тянуть. Но лучше всё-таки этим не заниматься.