gcc -fPIC похоже гадит с флагами оптимизации - PullRequest
3 голосов
/ 17 ноября 2009

Исходя из этого вопроса: how-do-i-check-if-gcc-is-performance-tail-recursion-оптимизация , я заметил, что использование gcc с -fPIC, похоже, разрушает эту оптимизацию,Я создаю разделяемую библиотеку, но мне, кажется, не нужна опция -fPIC.

Ну, мой вопрос: почему -fPIC меняет оптимизацию gcc?Нужно ли сохранять -fPIC по какой-либо причине?

Ответы [ 2 ]

4 голосов
/ 17 ноября 2009

При отсутствии таких деталей, как целевая архитектура и версия компилятора, возможное объяснение таково:

В позиционно-зависимом коде оптимизация хвостовой рекурсии, по сути, заключается в повторном использовании текущего фрейма стека и замене рассматриваемого call на jump. Синтаксис может быть call function заменен на jmp <small offset of function>.

В позиционно-независимом коде вызов может быть записан call function@PLT, если набор команд это позволяет (в данном примере это amd64). Его вполне можно заменить на jmp <small offset of function>@PLT, но эти две настройки мешают работе, и, возможно, разработчики gcc не удосужились реализовать оптимизацию хвостового вызова в последнем режиме.

2 голосов
/ 19 ноября 2009

В ia32 linux использование fpic означает, что у вас нет ebx, доступного для общего назначения, что наверняка повлияет на оптимизацию. Возможно, компилятор решил отказаться от оптимизации хвостовой рекурсии из-за давления в расписании регистра.

...