Рассмотрим заголовочный файл:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
или, альтернативно:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept;
int GetID() const noexcept;
};
inline T::T(int const ID_) noexcept : ID(ID_) {}
inline int T::GetID() const noexcept { return ID; }
В мире пре-модулей эти заголовки могут быть текстуально включены в несколько TU без нарушений ODR. Кроме того, поскольку задействованные функции-члены относительно малы, компилятор, вероятно, будет «встроен» (избегать вызовов функций при использовании) этих функций или даже оптимизирует некоторые экземпляры в T
целом.
В недавнем отчете о встрече, на которой C ++ 20 был закончен, я мог прочитать следующее утверждение:
Мы разъяснили значение
inline
интерфейсов модулей: намерение состоит в том, чтобы тела функций, которые не были явно объявленыinline
, не были частью ABI модуля, даже если эти тела функций появляются в интерфейсе модуля. Чтобы дать авторам модулей больший контроль над их ABI, функции-члены, определенные в телах классов в интерфейсах модулей, больше не являются неявнымиinline
.
Я не уверен, что не ошибаюсь. Означает ли это, что в мире модулей, чтобы компилятор мог оптимизировать вызовы функций, мы должны аннотировать их, inline
даже если они определены в классе?
Если да, будет ли следующий интерфейс модуля эквивалентен приведенным выше заголовкам?
export module M;
export
class T
{
private:
int const ID;
public:
inline explicit T(int const ID_) noexcept : ID(ID_) {}
inline int GetID() const noexcept { return ID; }
};
Несмотря на то, что у меня до сих пор нет компилятора с поддержкой модулей, я хотел бы начать использовать inline
подобное при необходимости, чтобы минимизировать будущий рефакторинг.
inline
ключевого слова никогда не будет встроена компилятором, правильно?