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

Является ли "встроенным" подразумевается в функциях-членах С++, определенных в определении класса

В соответствии со спецификацией С++ определены следующие два класса:

class A
{
   void f()
   {
   }
};

class B
{
   inline void f()
   {
   }
};

i.e, ставит "встроенный" квалификатор на такую ​​функцию-член, определенную в определении класса, полностью избыточным?

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

Спасибо:)

4b9b3361

Ответ 1

Это эквивалентные определения классов, за исключением целей правила Единого определения. Таким образом, стандарт не гарантирует, что вы можете скомпилировать один модуль перевода (TU) с одним определением класса и другим TU с другим, а затем соединить их вместе. Я сомневаюсь, что это когда-либо действительно закончится с реальной реализацией, но это то, что говорит стандарт.

Ключевое слово inline не имеет ничего общего с вложением. Это о том, разрешено ли несколько идентичных определений функции в разных ТУ. Если кто-то переводит определение функции в другое место, то они должны решить, следует ли пометить его inline следующим образом:

  • Если это файл .cpp для этого класса, то он действителен, чтобы пометить его inline, если он вызван только из этого TU. Тогда, вероятно, не имеет значения, помечен ли он inline или нет, но вы можете отметить его inline как подсказку компилятора, если вы считаете, что компилятор обратит внимание на то, что вы хотите.

  • Если он все еще находится в файле заголовка, он должен быть помечен inline, иначе вы получите несколько ошибок определения при связывании разных TU, которые используют заголовок.

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

Ответ 2

Стандарт ISO C++ гласит:

Функция, определенная в определении класса, является встроенной функцией.

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

Ответ 3

помещает "встроенный" квалификатор в такую ​​функцию-член, определенную в определении класса, полностью избыточным?

Да

Для стиля кода было бы разумно сохранить тег "inline", поэтому будущий разработчик понимает, что эта функция должна быть встроена, и не удаляет определение где-то еще и удаляет inlining?

Нет.
В строке указано "Одно правило определения" (и, следовательно, привязка по расширению). Если функция определена там, где требуется inline, и она не указана, это ошибка времени компиляции. Если это не нужно, это просто лишний беспорядок.

Итак, если вам это не нужно, удалите его. Если вам это нужно, поставьте его там (если вы забудете, что компилятор сообщит вам об этом).

Ответ 4

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

Что касается того, есть ли у него хорошая идея оставить его там - я на самом деле так не думаю. Было бы лучше дать подробный комментарий, объясняющий, почему функция ДОЛЖНА быть встроена (из которой я могу изложить только две причины: либо "это шаблон", в этом случае из подкладки невозможно, либо "производительность", в этом случае Я хотел бы увидеть некоторые подтверждающие доказательства, а не "он должен работать лучше, потому что он встроен", что я видел в некоторых местах.