2013-09-18 2 views
-1

Раньше я думал, что компилятор решает, нужно ли встроить функцию или нет во время компиляции.Встраивается ли во время компиляции или во время выполнения?

Но потом я нашел этот пример кода в «Эффективное использование C++»:

inline void f() {} // assume compilers are willing to inline calls to f 
void (*pf)() = f; // pf points to f 

f(); // this call will be inlined, because it's a "normal" call 
pf(); // this call probably won't be, because it's through a function pointer 

Теперь я запутался, что значит ли это решение, следует ли INLINE функцию или не делается во время выполнения, в зависимости от как вы используете эту функцию?

+0

Вот хороший текст: http://www.drdobbs.com/inline-redux/184403879 –

+0

Хмммм. Интересно, почему этот вопрос был опущен ... – Oleksiy

ответ

4

Нет, это все еще сделано во время компиляции. В вашем примере на самом деле есть две версии функции, созданной компилятором, одна встроенная, а другая нет.

Иногда компилятор имеет достаточно информации, чтобы знать, какую функцию указывает указатель на статический анализ, и может в любом случае встраивать его.

1

Является ли что-то встроенным или нет частью процесса генерации кода. Это работа компилятора. Ergo, inlining выполняется во время компиляции. Но только потому, что в некоторых местах функция встроена, не означает, что она должна быть встроена во все места. Так что это нормально для звонков на f(), чтобы быть встроенным, а звонки на pf() - нет.

Обратите внимание, что если компилятор может доказать себе, что pf всегда будет указывать на f в определенной точке вызова, тогда даже этот вызов может быть встроен. Я не знаю, продвигаются ли какие-либо компиляторы до сих пор, но это, безусловно, разрешено.

4

Inlining выполняется во время компиляции или во время соединения (кажется, компиляторы доходят до того, что они определяют определенные возможности вложения в время соединения и делают это через единицы перевода).

Причина не совсем ясно, будет ли pf() привести к встраиванию или нет в том, что компилятор может потенциально инлайн, что указывает на pf, если он может доказать, что pf будет указывать на некоторую функцию каждый раз, когда pf() вызывается! В определенных настройках это можно сделать, определив значения на основе постоянных выражений. Например:

void simple() 
{ 
    void (*pf)() = f; 
    pf(); 
} 

относительно просто, чтобы доказать, что pf всегда будет указывать на f. Если f может быть встроен, что безопасно. Если все становится более сложным, например, некоторые условия или вызовы к другим функциям задействованы, все становится достаточно сложным, что решение, конечно же, не так просто.

0

Мое понимание заключается в том, что встраивание выполняется во время компиляции. Однако к нему также относится эталонная компоновка.

Inlining - это «запрос» к компилятору. Которые можно игнорировать.

Когда: когда функция слишком сложная. Или когда: кто-то берет адрес функции (как пример, который вы дали, делает).

Когда кто-то берет адрес функции, то это означает, что функция должна занимать память. И компилятор создает для него хранилище.

Затем возникает проблема с функциями Inline внутри файлов заголовков, которые включены во многие места. Это должно привести к ошибке «множественного определения» при связывании времени.

Но в этой ситуации компоновщик «Рассматривается, чтобы игнорировать» несколько определений.

Источник: Мышление на C++, Страница 434, Последний абзац.

 Смежные вопросы

  • Нет связанных вопросов^_^