Поиск…


Вступление

Функция, определенная с помощью inline спецификатора, является встроенной функцией. Встроенная функция может быть размножена без нарушения правила Единого определения и поэтому может быть определена в заголовке с внешней связью. Объявление функции inline подсказывает компилятору, что функция должна быть встроена во время генерации кода, но не дает гарантии.

Синтаксис

  • inline function_declaration
  • inline function_definition
  • class {function_definition};

замечания

Обычно, если код, сгенерированный для функции, достаточно мал, это хороший кандидат, который должен быть встроен. Почему так? Если функция большая и встроена в цикл, для всех сделанных вызовов код большой функции будет дублироваться, что приведет к созданию раздутого бинарного размера. Но насколько мала?

Хотя встроенные функции кажутся отличным способом избежать накладных расходов на функционирование, следует отметить, что не все функции, отмеченные inline , встроены. Другими словами, когда вы говорите inline , это всего лишь подсказка для компилятора, а не порядок: компилятор не обязан встраивать функцию, ее можно игнорировать - большинство из них это делает. Современные компиляторы лучше делают такие оптимизации, что это ключевое слово теперь остается следствием прошлого, когда это предложение функции, вложенное программистом, было серьезно воспринято компиляторами. Даже функции, не отмеченные inline , встроены компилятором, когда он видит преимущество в этом.

Inline как директива привязки

Более практическое использование inline в современном C ++ происходит от использования его в качестве директивы linkage. При определении , а не объявлении функции в заголовке, который будет включен в несколько источников, тогда каждая единица перевода будет иметь свою собственную копию этой функции, ведущую к нарушению ODR (одно определение правила); это правило грубо говорит, что может быть только одно определение функции, переменной и т. д. Чтобы обойти это нарушение, обозначение определения функции inline неявно делает внутреннюю связь функции.

Вопросы и ответы

Когда следует писать ключевое слово 'inline' для функции / метода в C ++?

Только когда вы хотите, чтобы функция была определена в заголовке. Точнее, только когда определение функции может отображаться в нескольких единицах компиляции. Это хорошая идея, чтобы определить небольшие (как в одном лайнере) функции в файле заголовка, поскольку он дает компилятору больше информации для работы с оптимизацией кода. Это также увеличивает время компиляции.

Когда я не должен писать ключевое слово 'inline' для функции / метода в C ++?

Не добавляйте inline строку, если вы считаете, что ваш код будет работать быстрее, если компилятор сделает это.

Когда компилятор не знает, когда сделать функцию / метод встроенным?

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

Смотрите также

Объявление функции не-членной строки

inline int add(int x, int y);

Определение функции встроенной функции без члена

inline int add(int x, int y)
{
    return x + y;
}

Встроенные функции пользователя

// header (.hpp)    
struct A
{
    void i_am_inlined()
    {
    }
};

struct B
{
    void i_am_NOT_inlined();
};

// source (.cpp)    
void B::i_am_NOT_inlined()
{
}

Что такое функция вложения?

inline int add(int x, int y)
{
    return x + y;
}

int main()
{
    int a = 1, b = 2;
    int c = add(a, b);
}

В приведенном выше коде, когда add вложенный текст, полученный код станет чем-то вроде этого

int main()
{
    int a = 1, b = 2;
    int c = a + b;
}

Встроенную функцию нигде не видно, ее тело встраивается в тело вызывающего. Если бы add не встраивается, функция будет называться. Накладные расходы на вызов функции - например, создание нового фрейма стека , копирование аргументов, создание локальных переменных, переход (потеря локальности ссылки и отсутствие промахов кэш-памяти) и т. Д. - должны быть понесены.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow