встроенный в определение и декларацию - PullRequest
21 голосов
/ 14 февраля 2012

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

Это правда?Если я пользователь класса, действительно ли меня волнуют чрезмерные вызовы метода?Есть ли что-то не так с перечислением его как встроенного в определении и объявлении?В C ++ FAQ говорится:

Лучшая практика: только в определении вне тела класса.

Так кто же здесь?

Ответы [ 2 ]

13 голосов
/ 14 февраля 2012

Это звучит как две совершенно не связанные вещи.Ввод inline как для объявления в классе, так и для определения вне класса не требуется.Поместить это в одно из объявлений достаточно.

Если вы говорите о добавлении inline в файл .cpp, где определена функция, и эта функция является членом public, то вам следует , а не .Люди, которые вызывают inline функции, должны иметь свои определения видимыми для них.Стандарт C ++ требует этого.

9 голосов
/ 14 февраля 2012

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

Это чепуха. Маркировка функции inline не гарантирует, что функция на самом деле будет физически встроенной; даже если это так, это не гарантирует, что ваша функция будет работать «быстрее».

Помечая определение inline, а также объявление, вы просто путаете вещи, делая вид, что у вашего пользователя есть какая-либо гарантия, чего нет ...

Если я являюсь пользователем класса, действительно ли меня волнуют чрезмерные вызовы метода?

Не совсем.

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

...