Опускает ли -fomit-frame-pointer всегда указатель кадра? Бывает ли когда-нибудь ситуация, когда необходимо настроить и компьютер, и fp? Приводит ли динамический рост стека к настройке fp? Спрашиваю специально для MIPS32. Спасибо!
-fomit-frame-pointer *всегда* опускает fp?
Ответы (3)
Указатель фрейма на самом деле не нужен для правильного выполнения, за исключением случаев раскрутки исключения. Динамический рост стека обычно требует какого-то указателя кадра, но он не привязан к конкретному регистру, а скорее выделяется посредством обычного анализа потока данных.
По сути, -fomit-frame-pointer
понижает уровень FP от назначенного фиксированного регистра до псевдорегистра и делает инициализацию подлежащей устранению мертвого хранилища. Итак, ответ на первый вопрос — нет, он не всегда упускается.
Нет, указатель кадра обычно не требуется. Компилятор может обращаться к локальным переменным относительно указателя стека и не нуждается в специальном указателе фрейма.
Тем не менее, стандартная последовательность установки указателя фрейма может помочь при отладке аварийно завершенной программы (даже если она не скомпилирована с помощью -g
), поскольку отладчик может использовать информацию об указателе фрейма для восстановления стека вызовов. Без указателя кадра у него нет информации, чтобы выяснить, где начинается один кадр стека и заканчивается следующий.
Таким образом, при использовании -fomit-frame-pointer
вы жертвуете производительностью в обмен на гораздо более сложную отладку в случае сбоя. Если части вашего кода, критически важные для производительности, представляют собой небольшие циклы и не вызывают никаких функций, то отсутствие указателя фрейма также не даст большого преимущества.
Не человек mips, но то, что должно применяться к любой системе: если стек необходимо выровнять в какой-либо точке, необходимо использовать кадр для хранения исходного указателя (поскольку адрес стека и выравнивание могут быть неизвестны)