Подтвердить что ты не робот

Почему GCC удаляет указатель на 64-битный?

Какова причина отказа от указателя фрейма на 64-битных архитектурах по умолчанию? Я хорошо знаю, что он может быть включен, но почему GCC отключает его в первую очередь, если он включен для 32-битного? В конце концов, у 64-битного процессора больше регистров, чем у 32-разрядных ЦП.

Edit: Похоже, что указатель фрейма также будет удален для x86 при использовании более новой версии GCC. Из руководства:

"Начиная с версии GCC 4.6, значение по умолчанию (если оно не оптимизировано для размера) для 32-разрядных x86 и 32-разрядных целей Darwin x86 для Linux было изменено на -fomit-frame-pointer. Значение по умолчанию может быть отменено до -fno-omit-frame-pointer, настроив GCC с параметром configure -enable-frame-pointer configure.

Но почему?

4b9b3361

Ответ 1

Для x86-64 ABI (PDF) поощряет отсутствие указателя кадра. Обоснование более или менее "теперь у нас есть DWARF, поэтому нет необходимости в отладке или исключении, если мы сделаем это необязательным с первого дня, тогда никакое программное обеспечение не будет зависеть от его существования".

x86-64 имеет больше регистров, чем x86-32, но этого все еще недостаточно. Освобождение более универсальных регистров - это всегда хорошая вещь с точки зрения компилятора. Операции, требующие сканирование стека, медленнее, да, но они - редкие события, поэтому это хороший компромисс для бритья нескольких циклов от каждого вызова подпрограммы плюс меньше утечек стека.