Chà, trước tiên hãy phá hủy một số giả định của bạn:
- Một trong những lợi thế của các thư viện chỉ dành cho tiêu đề cho C ++ là chúng không cần phải được biên dịch riêng.
Biên dịch mọi thứ một cách riêng biệt có nghĩa là có khả năng không phải biên dịch lại mọi thứ nếu chỉ một phần thay đổi.
Vì vậy, một bất lợi thay vì một lợi thế.
- Trong C và C ++ nội tuyến chỉ có ý nghĩa nếu chức năng được xác định trong tệp tiêu đề *.
Có, hiệu ứng duy nhất inline
còn lại là ngoại lệ cho quy tắc một định nghĩa .
Khốn cho bạn nếu những định nghĩa đó khác nhau theo bất kỳ cách nào.
Vì vậy, nếu một hàm là nội bộ cho một đơn vị biên dịch, hãy đánh dấu nó static
. Điều đó cũng làm cho nội tuyến có nhiều khả năng hơn, vì chức năng cần phải có sẵn để nội tuyến nó.
Tuy nhiên, hãy xem tối ưu hóa thời gian liên kết, như được hỗ trợ bởi ít nhất MSVC ++, gcc và clang.
- Theo truyền thống, trong bố cục C, .c / .h đã được sử dụng, trong đó tiêu đề đại diện cho giao diện chung tối thiểu của đơn vị dịch thuật. Tương tự, .cpp / hpp.
Chà, chỉ trình bày giao diện tối thiểu chắc chắn là một trong những mục tiêu, để đạt được độ ổn định API và ABI cao hơn và để giảm thiểu thời gian biên dịch.
Đặc biệt là các lớp C ++ không thực sự hướng đến điều đó, vì tất cả các bit riêng tư bị rò rỉ vào tiêu đề, cũng như các lớp được bảo vệ cho dù bạn có muốn lấy từ nó hay không.
PIMPL mẫu thiết kế là để giảm các chi tiết như vậy.
Mặc dù phần tách giao diện và triển khai hoàn toàn thất bại trong C ++ là các mẫu.
Ủy ban đã cố gắng làm một cái gì đó với các mẫu xuất khẩu , nhưng điều đó đã bị bỏ qua vì quá phức tạp và không thực sự hoạt động.
Bây giờ, họ đang làm việc trên một hệ thống mô-đun thích hợp , mặc dù nó hoạt động chậm. Điều đó làm giảm đáng kể thời gian biên dịch và cũng sẽ tăng tính ổn định của API và ABI bằng cách giảm bề mặt của chúng.
Các thư viện chỉ tiêu đề thường có mã hiệu quả hơn và thời gian thực hiện khôn ngoan hơn so với bố cục truyền thống? Nếu vậy, điều này là do nội tuyến mở rộng hoặc tối ưu hóa khác?
Các thư viện chỉ dành cho tiêu đề có thể hiệu quả hơn về kích thước mã và thời gian thực hiện, mặc dù điều đó phụ thuộc vào việc thư viện có được chia sẻ hay không, sử dụng bao nhiêu, theo cách nào và liệu nội tuyến có chứng minh chiến thắng quyết định trong trường hợp cụ thể đó hay không.
Và lý do nội tuyến rất quan trọng đối với việc tối ưu hóa không phải vì bản thân nội tuyến là một sự thúc đẩy lớn như vậy, nhưng do các cơ hội để truyền bá liên tục và tối ưu hóa hơn nữa, nó mở ra.