2011-01-11 2 views
4

Можно создать дубликат:
When to use inline function and when not to use it ?инлайн и передовая практика

Я видел много исходных кодов с использованием различных синтаксисов относительно inline директивы.

namespace Foo 
{ 
    class Bar 
    { 
     public: 

      // 1 - inline on the declaration + implementation 
      inline int sum1(int a, int b) { return a + b; } 

      // 2 - inline on template declaration + implementation 
      template <typename T> 
      inline T sum2(T a, T b) { return a + b; } 

      // 3 - Nothing special on the declaration... 
      int sum3(int a, int b); 
    }; 

    // 3 - But the inline directive goes after 
    // In the same namespace and still in the header file 
    inline int Bar::sum3(int a, int b) { return a + b; } 
} 

мне не удалось найти «официальные» руководящие принципы, касающиеся использования inline: Я только знаю, что inline это только намек на компилятор и что он навязывает внутренней компоновку. Я не знаю об этом.

Вот мои вопросы:

  • Is (1) хорошая практика?
  • В (2) всегда есть директива inline? (Мое предположение было бы «нет», но я не могу объяснить, почему). Когда это необходимо?
  • (3) кажется наиболее используемым синтаксисом. Что-то не так с этим, или я должен использовать его тоже?
  • Есть ли другое использование (синтаксис) inline Я не знаю?

ответ

9

Нет, и нет! inline - это не только намек на компилятор, и он не обеспечивает внутренней связи.

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

+0

Большое спасибо. Кажется мне более ясным. Как насчет 'встроенных' и' шаблонных' функций? – ereOn

+0

@ereOn: функциональные шаблоны не являются функциями, но эффективно ведут себя так, как если бы они были 'inline' в любом случае. Явные специализации функций могут быть 'inline' независимыми от их исходного шаблона. Те же рекомендации могут быть соблюдены. –

+0

Я думаю, что это (и возможный дубликат, который я пропустил) отвечает на все мои вопросы. Спасибо. – ereOn

1

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

+0

Нет, компоновщику не нужно уменьшать это до одного экземпляра. Более правильным было бы сказать, надеюсь, функция будет встроена (и не будет символа), если это не удастся, она должна иметь внутреннюю связь. Должен ли он быть объединен с одним экземпляром или нет, это полностью необязательная оптимизация компоновщика. –

+0

В действительности это может быть уменьшено до 0 экземпляров, но определенно не более одного, то есть ODR сохраняется. – CashCow

2

Что касается ваших вопросов:

  1. Это не кажется хорошим использование, потому что любая функция члена осуществляется в теле класса неявно выраженные рядная. Другими словами, это конкретное встроенное объявление является избыточным. Тем не менее, эта функция сама по себе является хорошим кандидатом для встраивания, поскольку она маленькая, короткая и, вероятно, использует больше команд сборки для вызова, чем для выполнения.

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

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

  4. Нет, это все синтаксическое использование. Вы, кажется, знаете, что делаете! :-)

+0

+1 Спасибо, что ответили на все мои вопросы. :) – ereOn

0

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

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