Hãy xem xét tệp tiêu đề:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
Hay cách khác:
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; }
Trong một thế giới tiền mô-đun, các tiêu đề này có thể được bao gồm bằng văn bản trong nhiều TU mà không vi phạm ODR. Hơn nữa, vì các hàm thành viên có liên quan tương đối nhỏ, trình biên dịch có thể sẽ "nội tuyến" (tránh các lệnh gọi hàm khi sử dụng) các hàm đó, hoặc thậm chí tối ưu hóa T
hoàn toàn một số trường hợp .
Trong một báo cáo gần đây về cuộc họp nơi C ++ 20 đã kết thúc, tôi có thể đọc tuyên bố sau:
Chúng tôi đã làm rõ ý nghĩa của các
inline
giao diện mô-đun: mục đích là các phần tử của các hàm không được khai báo rõ rànginline
không phải là một phần của ABI của một mô-đun, ngay cả khi các thân hàm đó xuất hiện trong giao diện mô-đun. Để cung cấp cho các tác giả mô-đun quyền kiểm soát nhiều hơn đối với ABI của họ, các hàm thành viên được xác định trong các thân lớp trong các giao diện mô-đun không còn hoàn toàninline
.
Tôi không chắc là tôi không nhầm. Điều đó có nghĩa là, trong một thế giới mô-đun, để trình biên dịch có thể tối ưu hóa các lệnh gọi hàm, chúng ta phải chú thích chúng inline
ngay cả khi chúng được định nghĩa trong lớp?
Nếu vậy, giao diện mô-đun sau có tương đương với các tiêu đề ở trên không?
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ặc dù tôi vẫn không có trình biên dịch với các mô-đun hỗ trợ, tôi muốn bắt đầu sử dụng inline
như vậy khi thích hợp, để giảm thiểu tái cấu trúc trong tương lai.
inline
từ khóa sẽ không bao giờ được trình biên dịch nội tuyến, đúng không?