Подтвердить что ты не робот

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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