Rozważ plik nagłówkowy:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
lub alternatywnie:
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; }
W świecie przedmodułowym nagłówki te mogą być tekstowo zawarte w wielu jednostkach językowych bez naruszenia ODR. Ponadto, ponieważ zaangażowane funkcje składowe są stosunkowo małe, kompilator prawdopodobnie „wbuduje” (uniknie wywołań funkcji podczas korzystania) te funkcje, a nawet zoptymalizuje niektóre przypadki T
.
W ostatnim raporcie ze spotkania, w którym C ++ 20 został zakończony, mogłem przeczytać następujące oświadczenie:
Wyjaśniliśmy znaczenie
inline
interfejsów modułów: chodzi o to, że ciała funkcji, które nie są wyraźnie zadeklarowane,inline
nie są częścią ABI modułu, nawet jeśli te ciała funkcji pojawiają się w interfejsie modułu. Aby zapewnić autorom modułów większą kontrolę nad ich ABI, funkcje składowe zdefiniowane w obiektach klas w interfejsach modułów nie są już domyślnieinline
.
Nie jestem pewien, że się nie mylę. Czy to oznacza, że w świecie modułów, aby kompilator mógł zoptymalizować wywołania funkcji, musimy je opatrzyć adnotacjami, inline
nawet jeśli są zdefiniowane w klasie?
Jeśli tak, to czy następujący interfejs modułu byłby równoważny z powyższymi nagłówkami?
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; }
};
Mimo że nadal nie mam kompilatora ze wsparciem dla modułów, chciałbym zacząć używać go w inline
razie potrzeby, aby zminimalizować przyszłe refaktoryzacje.
inline
słowa kluczowego nigdy nie zostanie wprowadzona przez kompilator, prawda?