Да, современные наборы инструментов C ++ способны встроить функции, даже если они не являются встроенными функциями (и их определение не известно в модуле перевода, где происходит вызов), при сборке с включенной оптимизацией во время соединения.В GCC вы можете включить LTO с помощью опции -flto
.По сути, они обычно работают так, что компилятор, компилируя ваш исходный код, не только напрямую генерирует объектный код, но и записывает свое внутреннее представление вашего кода в объектный файл.При связывании, вместо простого связывания объектного кода, компилятор в основном повторно запускает генерацию кода из этого внутреннего представления для всей программы, как если бы он был записан в одном большом исходном файле.Это может значительно увеличить время, необходимое для создания вашей программы.Но это позволяет выполнять некоторые важные оптимизации, такие как встраивание, даже через границы единиц перевода…
Статические библиотеки - это просто архивы объектных файлов, поэтому, если вы собираете свою библиотеку с включенным LTO и связываете свой вызывающий код с ней,Компилятор сможет встроить функции прямо в вызывающий код.Обратите внимание, что, в конце концов, компилятор все еще должен решить, будет ли он встроенным или нет, поэтому нет никаких гарантий, что функция будет встроена наверняка…