GCC -flto и встроенное ключевое слово
У меня простой вопрос: влияет ли ключевое слово inline на оптимизацию времени ссылки? Под оптимизацией времени соединения я имею в виду версию GCC, которая поддерживает -flto(Оптимизация времени соединения).
Например:
main.c
#include "b.h"
int main() {
print_x(2);
return 0;
}
ЬН
extern void print_x(int x);
До нашей эры
#include "b.h"
#include "stdio.h"
inline void print_x(int x) {
printf("%d\n", x);
}
Будет ли ключевое слово inline в bc иметь значение, когда компоновщик выполняет LTO(оптимизация времени ссылки)?
1 ответ
В принципе, компилятор может использовать наличие inline
ключевое слово, чтобы изменить его эвристику. Тем не менее, насколько присутствие inline
спецификатор изменяет свою эвристику - это деталь реализации; даже до точки игнорирования (6.7.4.5):
[...] Создание функции как встроенной функции предполагает, что вызовы функции должны быть максимально быстрыми. Степень эффективности таких предложений определяется реализацией. [121]
[121] Например, реализация может никогда не выполнять встроенную замену или может выполнять только встроенную замену вызовов в области действия встроенного объявления.
В стандарте C не упоминается LTO, поэтому по этому поводу сказать немного больше.
Теперь, конечно, компилятор может иметь различную эвристику и обрабатывать inline
Ключевое слово по-разному зависит от того, компилируется ли оно в режиме LTO или нет. Проверка руководства и / или реализации вашего компилятора необходима для ответа на этот вопрос и, возможно, варьируется от версии к версии.
Для GCC, в частности, есть документация по -flto
вариант и на внутренностях LTO. Проблема, однако, заключается в том, что GCC в настоящее время не дает много подробностей в руководстве пользователя. Следовательно, вы не можете полагаться на его стабильность, даже если вы можете прочитать текущую реализацию и посмотреть, какова эвристика.
В любом случае, учитывая, насколько сильно варьируются встроенные решения компилятора (поставщик, версия, параметры и т. Д.), Нет особого смысла пытаться адаптировать свой код под него. Если вам действительно нужно изменить встроенные решения, вы должны использовать конкретные подсказки, предоставленные вашим компилятором, вместо того, чтобы пытаться настроить результаты его алгоритмов. Например, для GCC, попробуйте использовать __attribute__((always_inline))
,
Связанный: оптимизация времени соединения и inline