Betrachten Sie die Header-Datei:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
oder alternativ:
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 einer Welt vor den Modulen können diese Header ohne ODR-Verstöße in mehreren TU enthalten sein. Da die beteiligten Elementfunktionen relativ klein sind, würde der Compiler diese Funktionen wahrscheinlich "inline" (Funktionsaufrufe bei der Verwendung vermeiden) oder sogar einige Instanzen T
insgesamt optimieren .
In einem kürzlich veröffentlichten Bericht über das Meeting, bei dem C ++ 20 beendet wurde, konnte ich die folgende Aussage lesen:
Wir haben die Bedeutung von
inline
in Modulschnittstellen geklärt : Es ist beabsichtigt, dass nicht explizit deklarierte Funktionskörperinline
nicht Teil des ABI eines Moduls sind, selbst wenn diese Funktionskörper in der Modulschnittstelle erscheinen. Um den Modulautoren mehr Kontrolle über ihre ABI zu geben, sind in Klassenkörpern in Modulschnittstellen definierte Elementfunktionen nicht mehr implizitinline
.
Ich bin mir nicht sicher, ob ich mich nicht irre. Bedeutet das, dass in einer Modulwelt, damit der Compiler Funktionsaufrufe optimieren kann, wir sie so kommentieren müssen, als inline
ob sie in der Klasse definiert wären?
Wenn ja, würde die folgende Modulschnittstelle den obigen Headern entsprechen?
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; }
};
Auch wenn ich noch keinen Compiler mit Modulunterstützung habe, möchte ich ihn inline
gegebenenfalls so verwenden, um das zukünftige Refactoring zu minimieren.
inline
Schlüsselwort wird also niemals vom Compiler eingefügt, richtig?