2010-09-12 4 views
34

Когда я пишу простой (не шаблонный) класс, если реализация функции предоставляется «прямо на месте», она автоматически обрабатывается как inline.C++ template and inline

class A { 
    void InlinedFunction() { int a = 0; } 
    // ^^^^ the same as 'inline void InlinedFunction' 
} 

Как насчет этого правила при разговоре о шаблонных классах?

template <typename T> class B { 
    void DontKnowFunction() { T a = 0; } 
    // Will this function be treated as inline when the compiler 
    // instantiates the template? 
}; 

Кроме того, как это inline правило применяется к невложенным шаблонным функциям, как

template <typename T> void B::DontKnowFunction() { T a = 0; } 

template <typename T> inline void B::DontKnowFunction() { T a = 0; } 

Что произойдет в первом и во втором случае здесь?

спасибо.

+0

Могу ли я спросить, почему вы хотите узнать ответ на этот вопрос? Я сделал довольно много C++-кодирования, и я не сталкивался с обстоятельствами, в которых это имело большое значение. –

+18

@ Benoît То же самое здесь, но когда я писал несколько фрагментов кода на основе шаблонов, я понял, что на самом деле я не знаю, что происходит в том случае, о котором я рассказывал. Так почему бы не задать вопрос? :) –

+0

Не уверен, что вы ищете в вопросе класса, но меня интересует ответ: o) Я не верю, что что-то особенное происходит с DontKnowFunction() и встроенным. Если тело является частью декларации класса, тогда используется его подразумеваемая неявная вставка inline, и тело находится вне декларации. – skimobear

ответ

3

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

+15

Составителям не разрешено игнорировать ' inline', и я не знаю современных компиляторов. 'inline' делает конкретные четко определенные изменения в языковых правилах для нескольких определений функций. Это не просто намек. –

+20

inline - это очень специфический и определяющий смысл. Но это очень мало связано с «Code in-line», и большинство современных компиляторов игнорируют его в отношении «подсказки», которую он дает для «кодирования кода». Это условия ссылки и другие вещи, которые нельзя игнорировать. –

+6

Чарльз, компиляторы могут игнорировать встроенные квалификаторы. http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.1 – maayank

1

Входящее ключевое слово не является «правилом». Это всего лишь предложение/намек на компилятор, и то, что он делает с ним, полностью зависит от него и его реализации. Имея это в виду, невозможно узнать, что будет с вашими примерами. Компилятор может на самом деле встроить все, некоторые или ни один из них.

+0

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

+0

Правильно, но независимо от того, есть ли явная или неявно встроенная строка, компилятор может сделать с ней то, что, таким образом, вы не сможете заранее определить поведение компиляторов. –

+0

Это не совсем правильно @RC. - «Реализация не требуется для выполнения этой встроенной подстановки [тела функции] в точке вызова, однако, даже если эта встроенная подстановка опущена, другие правила для встроенных функций, определенных в 7.1.2, по-прежнему должны соблюдаться. " [рабочий проект 7.1.2/2] – boycy

13

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

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

+0

«Это * объявлено * в этом классе», следует изменить на * Определено *, нет? –

+1

@JohanLundberg да, я считаю, что это что я хотел сказать. Я изменил его, спасибо. –

+0

Что произойдет, если встроенный квалификатор для шаблона функции, который не является членом класса? Является ли inline также таким образом? –