Considera il file di intestazione:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
o, in alternativa:
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; }
In un mondo di pre-moduli, queste intestazioni potrebbero essere incluse testualmente in più TU senza violazioni ODR. Inoltre, poiché le funzioni membro coinvolte sono relativamente piccole, il compilatore probabilmente "inline" (evita le chiamate di funzione quando si utilizza) quelle funzioni, o addirittura ottimizza alcune istanze del T
tutto.
In un recente rapporto sull'incontro in cui C ++ 20 era finito, ho potuto leggere la seguente dichiarazione:
Abbiamo chiarito il significato delle
inline
interfacce nei moduli: l'intento è che corpi di funzioni che non sono esplicitamente dichiaratiinline
non facciano parte dell'ABI di un modulo, anche se quei corpi di funzioni compaiono nell'interfaccia del modulo. Al fine di dare agli autori dei moduli un maggiore controllo sulla loro ABI, le funzioni membro definite nei corpi di classe nelle interfacce dei moduli non sono più implicitamenteinline
.
Non sono sicuro di non sbagliarmi. Ciò significa che, in un mondo di moduli, affinché il compilatore sia in grado di ottimizzare le chiamate di funzione via, dobbiamo annotarle come inline
se fossero definite in classe?
In tal caso, la seguente interfaccia del modulo sarebbe equivalente alle intestazioni sopra?
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; }
};
Anche se non ho ancora un compilatore con il supporto dei moduli, vorrei iniziare a usarlo in questo inline
modo, quando appropriato, per ridurre al minimo il refactoring futuro.
inline
parola chiave non sarà mai sottolineata dal compilatore, giusto?