Автоматически встроенные функции через единицы перевода и 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, разделенные на разные исходные файлы как встроенные. Это работает, только если вы объявите их в одном исходном файле.

Другие вопросы по тегам