Автоматически встроенные функции через единицы перевода и gcc 4.6
Если я не объявил функцию f как встроенную. Просто так:
Ах:
X f(Y y);
a.cpp:
X f(Y y)
{
...
}
Затем в другом модуле перевода:
B.cpp:
#include "A.h"
Z g(W w)
{
...
... f(...) ...
...
}
Затем я компилирую два блока перевода Ao и Bo с помощью gcc 4.6, а затем связываю их также через gcc. (Может быть с -O3 на оба шага)
Будет ли gcc рассмотреть возможность включения функции для повышения производительности во время соединения? Или уже слишком поздно?
В обзоре кода кто-то предложил, чтобы я не объявлял свои функции как встроенные, так как компилятор знает лучше, чем когда я включаю. Я всегда был под впечатлением, если только функция не определена в заголовке, а компилятор не имеет возможности встроить ее.
(Если ответ отличается для режима C, режима C++ или режима gnu++0x, укажите это также)
3 ответа
Функция называется Link Time Optimization(LTO) и по умолчанию не включена в GCC 4.6.
[edit] При включенном LTO GCC сохранит "GIMPLE" представление X f(Y y)
в A.obj
, Это представление немного более обработано, чем обычная предварительная обработка C++, но не намного. В частности, он еще не переведен на сборку. В результате компоновщик все еще может встроить его.
Компилятор может выбрать встроенный или нет для повышения производительности. Но в этом случае компилятор беспомощен, я думаю. нет способа встроить функцию f.
NB. Даже если вы используете ключевое слово, это всего лишь предложение. окончательное решение о том, встроить или нет, зависит от компилятора. Так что нет никаких проблем в предложении компилятору.
Я не думаю, что gcc может создавать функции make, разделенные на разные исходные файлы как встроенные. Это работает, только если вы объявите их в одном исходном файле.