2014-03-11 4 views
1

Мне было интересно, можно ли явно указать пользовательское соглашение о вызове, но с учетом зрелости и количества оптимизаций, найденных в компиляторе, когда не указано соглашение о вызове, могу ли я ожидать, что компилятор будет выбирать лучший для конкретной функции, например, если параметров мало и примитивно использовать fastcall и т. д.Поддерживает ли GCC оптимизацию вызовов?

+5

Если функция не является 'static', то компилятор * должен * соответствовать стандарту стандартного вызова –

+1

Если компилятор может видеть как сайт вызова, так и тело функции (для чего это необходимо для этого) мог бы просто вставить вызов в любом случае. –

+0

@NiklasB. и компоновщик видит все сайты вызовов и * может * делать все, что захочет – Caleth

ответ

3

Это «соглашение» по какой-то причине. Все должны следовать соглашению или вы не можете назвать свою функцию из другого модуля.

Однако, если функция не видна, то GCC имеет опции. Он может встроить функцию или вызвать ее, но она хочет. Он может даже разбить его на «горячие» и «холодные» части и встроить путь к горячим кодам. Обычно это происходит только при построении с оптимизацией профиля.

Если вы хотите, чтобы GCC выполнял такие оптимизации, работайте над тем, чтобы скрыть ваши функции. Если вы создаете исполняемый файл в программе -fwhole-program. Если вы строите библиотеки, посмотрите на -fvisibility = hidden. Также загляните в -flto.

Смежные вопросы