Розглянемо файл заголовка:
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
ключового слова ніколи не буде накреслена компілятором, правда?