Я использую нелокальные переходы (setjmp
, longjmp
). Я хотел бы знать, может ли это быть проблемой для выступлений. Сохраняет ли setjmp
весь стек или только некоторые указатели?
Спасибо.
Я использую нелокальные переходы (setjmp
, longjmp
). Я хотел бы знать, может ли это быть проблемой для выступлений. Сохраняет ли setjmp
весь стек или только некоторые указатели?
Спасибо.
Как сказал Йенс, если это когда-либо станет заметным узким местом, переделайте его, поскольку предполагается, что setjmp
используется не так.
Что касается вашего вопроса:
Это, вероятно, зависит от того, на какой архитектуре вы запускаете свою программу и что компилятор делает с вашим кодом. В ARM goto
, вероятно, переводится в одну инструкцию перехода, что довольно быстро. setjmp
и longjmp
, с другой стороны, необходимо сохранить и восстановить все регистры, чтобы возобновить выполнение после перехода. На ARMv7-a с поддержкой NEON для этого потребуется сохранить примерно 16 32-битных регистров и до 16 128-битных регистров, что представляет собой довольно много дополнительной работы по сравнению с простой ветвью.
Я понятия не имею, требуется ли меньше работы на x86, но я подозреваю, что goto
там тоже намного дешевле.
setjmp
должен сохранить достаточно информации, чтобы программа могла продолжить выполнение при вызове longjmp
. Обычно это будет текущий указатель стека вместе с текущими значениями любых других регистров ЦП, которые могут повлиять на вычисление.
Я не могу комментировать, вызывает ли это «проблему с производительностью», потому что я не знаю, с чем вы хотите это сравнить.
Быстрый ответ: вряд ли. Если setjmp
когда-нибудь станет заметным узким местом в вашей программе, я бы сказал, что дизайн вашей программы нуждается в капитальном ремонте.