Başlık dosyasını düşünün:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
Veya alternatif olarak:
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; }
Bir ön modül dünyasında, bu başlıklar ODR ihlali olmaksızın çoklu TU'ya metinsel olarak dahil edilebilir. Ayrıca, ilgili üye işlevleri nispeten küçük olduğu için, derleyici muhtemelen bu işlevleri "satır içi" (kullanırken işlev çağrılarından kaçınır) veya hatta bazı örnekleri T
tamamen optimize eder .
C ++ 20'nin bittiği toplantıyla ilgili son bir raporda , aşağıdaki ifadeyi okuyabilirim:
inline
Modül arabirimlerindeki anlamını açıklığa kavuşturduk : amaç, açıkça belirtilmeyeninline
işlev gövdelerinin, bu işlev gövdeleri modül arabiriminde görünse bile bir modülün ABI'sının bir parçası olmamasıdır. Modül yazarlarına ABI'leri üzerinde daha fazla kontrol sağlamak için modül arayüzlerinde sınıf gövdelerinde tanımlanan üye işlevler artık örtük değildirinline
.
Yanlış yaptığımdan emin değilim. Bu, bir modül dünyasında, derleyicinin işlev çağrılarını optimize edebilmesi için inline
, sınıfta tanımlanmışlar gibi onlara açıklama eklememiz gerektiği anlamına mı geliyor ?
Öyleyse, aşağıdaki modül arayüzü yukarıdaki başlıklara eşdeğer olur mu?
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; }
};
Hala modül desteğine sahip bir derleyicim olmasa da inline
, gelecekteki yeniden düzenlemeyi en aza indirmek için uygun olduğunda böyle kullanmaya başlamak istiyorum.
inline
anahtar kelime içermeyen bir modüldeki fonksiyon derleyici tarafından asla satır içine alınmaz, değil mi?