(Вы действительно хотели спросить о ситуации, когда определение находится в файле .cpp
, отличном от того, который вы сейчас компилируете, а затем связываете его позже. Компилятору нет дела до .hpp
или .cpp
, но около единиц перевода .)
В любом случае, на http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html, прокрутите вниз до «flno»:
Эта опциязапускает стандартный оптимизатор времени соединения.[...] Первые два вызова GCC сохранят представление GIMPLE в виде байт-кода в специальных разделах ELF внутри foo.o и bar.o.Последний вызов будет читать байт-код GIMPLE из foo.o и bar.o, объединять два файла в одно внутреннее изображение и компилировать результат как обычно.Поскольку и foo.o, и bar.o объединены в одно изображение, это приводит к тому, что весь межпроцедурный анализ и оптимизация в GCC работают для двух файлов, как если бы они были одним.Это означает, например, что вкладчик сможет встроить функции в bar.o в функции в foo.o и наоборот.
Итак, да, можно оптимизировать inline через границы модуля.
Однако C ++ по-прежнему требует:
Встроенная функция должнабыть определенным в каждой единице перевода, в которой он используется.[3.2 / 3, C ++ 03]
Так что на самом деле вы не можете писать свой код, чтобы воспользоваться этим, если вы использовали ключевое слово inline
;вместо этого вы полагаетесь на компоновщик, «просто решающий» встроить свою функцию, если он сочтет нужным.Так что это не вариант, который позволит вам перемещать код.
Помните, что запись inline
в вашем коде не имеет отношения один к одному с функцией на самом деле получать физическую привязку;это только подсказка компилятору (или компоновщику, если у вас включены вышеупомянутые оптимизации во время компоновки).