C ++ шаблон и встроенный - PullRequest
       19

C ++ шаблон и встроенный

36 голосов
/ 12 сентября 2010

Когда я пишу простой (не шаблонный) класс, если реализация функции предоставляется «прямо на месте», она автоматически обрабатывается как 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; }

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

Спасибо.

Ответы [ 3 ]

13 голосов
/ 12 сентября 2010

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

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

2 голосов
/ 12 сентября 2010

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

1 голос
/ 12 сентября 2010

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

...