Pertimbangkan file tajuk:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
atau, sebagai alternatif:
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; }
Dalam dunia pra-modul, tajuk ini mungkin secara teks termasuk dalam banyak TU tanpa pelanggaran ODR. Selain itu, karena fungsi anggota yang terlibat relatif kecil, kompiler kemungkinan akan "inline" (menghindari panggilan fungsi saat menggunakan) fungsi-fungsi tersebut, atau bahkan mengoptimalkan beberapa instance dariT
sekaligus.
Dalam laporan terbaru tentang pertemuan di mana C ++ 20 selesai, saya bisa membaca pernyataan berikut:
Kami mengklarifikasi makna
inline
dalam antarmuka modul: tujuannya adalah bahwa badan fungsi yang tidak dinyatakan secara eksplisitinline
bukan bagian dari ABI modul, bahkan jika badan fungsi tersebut muncul di antarmuka modul. Untuk memberi penulis modul kontrol yang lebih besar atas ABI mereka, fungsi anggota yang didefinisikan dalam kelas di antarmuka modul tidak lagi secara implisitinline
.
Saya tidak yakin saya tidak salah. Apakah itu berarti bahwa, dalam dunia modul, agar kompiler dapat mengoptimalkan panggilan fungsi jauh kita harus membuat anotasi mereka inline
bahkan jika mereka didefinisikan di kelas?
Jika demikian, apakah antarmuka modul berikut ini setara dengan header di atas?
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; }
};
Meskipun saya masih belum memiliki kompiler dengan dukungan modul, saya ingin mulai menggunakan inline
seperti itu ketika sesuai, untuk meminimalkan refactoring di masa depan.
inline
kata kunci tidak akan pernah diuraikan oleh kompiler, benar?