ヘッダーファイルについて考えます。
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; }
モジュール前の世界では、これらのヘッダーは、ODR違反なしで複数のTUにテキストで含まれる場合があります。さらに、関連するメンバー関数は比較的小さいので、コンパイラーはそれらの関数を「インライン化」する(使用時に関数呼び出しを回避する)か、一部のインスタンスを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
キーワードのないモジュール内の関数は、コンパイラーによってインライン化されることはありませんよね?