Considérez le fichier d'en-tête:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
Ou bien:
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; }
Dans un monde de pré-modules, ces en-têtes peuvent être inclus textuellement dans plusieurs TU sans violations ODR. De plus, étant donné que les fonctions membres impliquées sont relativement petites, le compilateur devrait probablement "inline" (éviter les appels de fonction lors de l'utilisation) de ces fonctions, ou même optimiser loin certaines instances de T
tout à fait.
Dans un récent rapport sur la réunion où C ++ 20 s'est terminé, j'ai pu lire la déclaration suivante:
Nous avons clarifié la signification des
inline
interfaces dans le module: l'intention est que les corps de fonctions qui ne sont pas explicitement déclarésinline
ne fassent pas partie de l'ABI d'un module, même si ces corps de fonction apparaissent dans l'interface du module. Afin de donner aux auteurs de modules plus de contrôle sur leur ABI, les fonctions membres définies dans les corps de classe dans les interfaces de module ne le sont plus implicitementinline
.
Je ne suis pas sûr de ne pas me tromper. Cela signifie-t-il que, dans un monde de modules, pour que le compilateur puisse optimiser les appels de fonction loin, nous devons les annoter comme inline
s'ils étaient définis en classe?
Dans l'affirmative, l'interface de module suivante serait-elle équivalente aux en-têtes ci-dessus?
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; }
};
Même si je n'ai toujours pas de compilateur avec prise en charge des modules, j'aimerais commencer à l'utiliser inline
comme il convient, afin de minimiser la refactorisation future.
la source
inline
mot - clé ne sera jamais insérée par le compilateur, n'est-ce pas?