Vì vậy, tôi tự hỏi nó kỹ thuật này thực sự được sử dụng trong thực tế? Tôi nên sử dụng nó ở khắp mọi nơi, hoặc thận trọng?
Tất nhiên nó được sử dụng. Tôi sử dụng nó trong dự án của tôi, trong hầu hết các lớp.
Lý do sử dụng thành ngữ PIMPL:
Tương thích nhị phân
Khi bạn đang phát triển thư viện, bạn có thể thêm / sửa đổi các trường thành XImpl
mà không phá vỡ tính tương thích nhị phân với máy khách của bạn (điều đó có nghĩa là sự cố!). Vì bố cục nhị phân của X
lớp không thay đổi khi bạn thêm các trường mới vào Ximpl
lớp, nên việc thêm chức năng mới vào thư viện trong các bản cập nhật phiên bản nhỏ là an toàn.
Tất nhiên, bạn cũng có thể thêm các phương thức không ảo công khai / riêng tư mới vào X
/ XImpl
mà không phá vỡ tính tương thích nhị phân, nhưng đó là ngang bằng với kỹ thuật thực hiện / tiêu đề tiêu chuẩn.
Ẩn dữ liệu
Nếu bạn đang phát triển một thư viện, đặc biệt là một thư viện độc quyền, có thể bạn không muốn tiết lộ những thư viện / kỹ thuật triển khai nào khác được sử dụng để triển khai giao diện chung của thư viện của bạn. Vì vấn đề Sở hữu trí tuệ hoặc vì bạn tin rằng người dùng có thể bị đưa ra các giả định nguy hiểm về việc triển khai hoặc chỉ phá vỡ sự đóng gói bằng cách sử dụng các thủ thuật đúc khủng khiếp. PIMPL giải quyết / giảm thiểu điều đó.
Thời gian biên soạn
Thời gian biên dịch được giảm xuống, vì chỉ X
cần xây dựng lại tệp nguồn (triển khai) khi bạn thêm / xóa các trường và / hoặc phương thức vào XImpl
lớp (ánh xạ để thêm các trường / phương thức riêng tư trong kỹ thuật tiêu chuẩn). Trong thực tế, đó là một hoạt động phổ biến.
Với kỹ thuật triển khai / tiêu đề tiêu chuẩn (không có PIMPL), khi bạn thêm một trường mới vào X
, mọi máy khách đã từng phân bổ X
(trên ngăn xếp hoặc trên heap) cần phải được biên dịch lại, bởi vì nó phải điều chỉnh kích thước của phân bổ. Chà, mọi khách hàng chưa từng phân bổ X cũng cần được biên dịch lại, nhưng đó chỉ là chi phí hoạt động (mã kết quả ở phía máy khách sẽ giống nhau).
Hơn nữa, với việc phân tách tiêu đề / triển khai tiêu chuẩn XClient1.cpp
cần phải được biên dịch lại ngay cả khi một phương thức riêng X::foo()
được thêm vào X
và X.h
thay đổi, mặc dù XClient1.cpp
không thể gọi phương thức này vì lý do đóng gói! Giống như ở trên, đó là chi phí hoạt động thuần túy và có liên quan đến cách các hệ thống xây dựng C ++ ngoài đời thực hoạt động.
Tất nhiên, việc biên dịch lại là không cần thiết khi bạn chỉ sửa đổi việc triển khai các phương thức (vì bạn không chạm vào tiêu đề), nhưng đó là ngang bằng với kỹ thuật thực hiện / tiêu đề tiêu chuẩn.
Có phải kỹ thuật này được khuyến nghị sử dụng trong các hệ thống nhúng (trong đó hiệu suất rất quan trọng)?
Điều đó phụ thuộc vào mức độ mạnh mẽ của mục tiêu của bạn. Tuy nhiên, câu trả lời duy nhất cho câu hỏi này là: đo lường và đánh giá những gì bạn được và mất. Ngoài ra, hãy xem xét rằng nếu bạn không xuất bản một thư viện có nghĩa là được sử dụng trong các hệ thống nhúng bởi các khách hàng của bạn, chỉ áp dụng lợi thế về thời gian biên dịch!
struct XImpl : public X
. Điều đó cảm thấy tự nhiên hơn đối với tôi. Có một số vấn đề khác tôi đã bỏ lỡ?