LINUX.ORG.RU

[C][setjmp.h] Стоимость операции.

 


0

0

Насколько дорого пользоваться longjmp?

Как я понял, setjmp запоминает позицию в стеке, а longjmp просто очищает стек, пока не наткнётся на нужную нам позицию.

Случится ли что-нибудь плохое, если я буду обильно пользоваться этими фукциями?

Ответ на: комментарий от linuxfan

Ясно. Насчёт обильного пользования понятно.

Вопрос по поводу стоймости операции открыт.

И да, я правильно понимаю как она работает?

setjmp запоминает позицию в стеке, а longjmp просто очищает стек

Ruga-Suneto
() автор топика
Ответ на: комментарий от Ruga-Suneto

есть подозрение, что branch predictor обязательно ошибётся, будет промах в кеше инструкций, и возможно instruction window полностью очистится.

rha
()
Ответ на: комментарий от rha

> есть подозрение ...

чего тут подозревать-то. __longjmp() это просто
goto + восстановление нескольких регистров.

longjmp() - то же самое + unwind в случае pthreads.

см sysdeps/x86_64/__longjmp.S

idle ★★★★★
()
Ответ на: комментарий от idle

>чего тут подозревать-то. __longjmp() это просто

goto + восстановление нескольких регистров.

это всё хорошо, когда твоя программа не использует динамическую память.
в противном случае - дуршлаг

xydo ★★
()
Ответ на: комментарий от xydo

> это всё хорошо, когда твоя программа не использует

динамическую память. в противном случае - дуршлаг


ничего не понял... что имелось в виду?

idle ★★★★★
()
Ответ на: комментарий от xydo

причем если с goto отследить подобное вполне возможно, то с longjmp все твои функции автоматически лишаются права выделять память динамически.

в общем, longjmp это еще большее зло, чем goto

xydo ★★
()
Ответ на: комментарий от xydo

о, xydo в репертуаре ;)

вопрос был про стоимость, не? топикстартер, я уверен,
и сам догадывается про возможные проблемы.

idle ★★★★★
()
Ответ на: комментарий от xydo

У тебя, видимо, любой цикл вызывает ужас, да? Ведь можно же вот так написать:

while (somevar !=  somevalue) {
    ptr = malloc(SZ);
    if (blah_blah_blah)
        continue;
    somevar = somevalue;
}

А-а-а-а! while — решето! Ужас-ужас-ужас!!! 8))

kemm
()
Ответ на: комментарий от xydo

это всё хорошо, когда твоя программа не использует динамическую память. в противном случае - дуршлаг

while и динамическое выделение памяти несовместимы!

Так лучше? 8))

kemm
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.