Почему GCC сбрасывает указатель кадра на 64-битный? - PullRequest
14 голосов
/ 23 мая 2011

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

Редактировать:

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

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

Но почему?

1 Ответ

10 голосов
/ 23 мая 2011

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

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

...