[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Продавленный стек



11.09.2014 23:32, Dmitrii Kashin пишет:

>>> Но всё равно получаю SegFault в следствие переполнения.
>> Дело ведь не в неявности вызова команды а в рекурсии.
>> Про неявный return ( ret ) я упомянул для того что бы показать где
>> освобождается стек.
> Простите, Алексей, я хочу уточнить одну деталь. Я правильно сейчас
> понимаю, что Вы утверждаете, что рекурсивно описанная процедура всегда
> порождает рекурсивный процесс, выедающий стек?
Выеданием стека я назвал не переполнение а активное его использование.
Если оптимизатор построил хвостовую, то стек не задействуется. На
сколько я помню разворачивается в цикл.
При нормальных условиях дефолтного размера стека хватает даже достаточно
глубоких рекурсиях.
Он нужен для хранения адреса возврата и, в зависимости от способа вызова
функции, параметров.
В первоначальном коде я не обнаружил условия выхода из рекурсии.
А значит у вас выедался стек при вызове функции + расход на выделение
памяти под класс в каждом вызове,
возможно выделение памяти производилось тоже на стеке.
Думаю именно в этом и была причина сегфолта - стек закончился в
следствии ничем не ограниченного выедания :)
>>> Тем не менее, я переписал этот кусок при помощи цикла, и программа
>>> вроде как валиться перестала. Такой результат меня полностью
>>> устраивает, спасибо.
>> Если Grid1D не указатель, то многовато у вас копирования класса в
>> циклах. просядет производительность.
> Это цена удобства. Самая первая версия программы содержала указатели во
> всех функциях - в результате я замучился: во-первых бесконечные
> стрелочки сделали код совершенно нечитаемым, особенно в научных формулах
> (ну я где-то полгода назад жаловался в этой рассылке об этом), а
> во-вторых у меня стали получаться конструкции, которые меня очень уж
> угнетали, вот по типу этих вот:
> ----------
> return &(grid->cells)[cell_number];
> (get_cell(newgrid,i))->convergence = coef;
> ----------
> Расстановка стрелочек, скобочек и амперсанов стала основной работой,
> которой я занимался вместо того, чтобы модифицировать логику программы.
Сильно зависит от проработанности структуры программы.

> Так что при работе с Си, копирование имеет свои плюсы.
Как раз на Си проще передать указатель чем копировать. А вот Си++ делает
это самостоятельно.


С уважением, Алексей А.

Reply to: