Tôi thấy rất nhiều mã nguồn sử dụng thành ngữ PImpl trong C ++. Tôi giả sử mục đích của nó là để ẩn dữ liệu / loại / triển khai riêng tư, vì vậy nó có thể loại bỏ sự phụ thuộc và sau đó giảm thời gian biên dịch và tiêu đề bao gồm vấn đề.
Nhưng các lớp giao diện / trừu tượng thuần túy trong C ++ cũng có khả năng này, chúng cũng có thể được sử dụng để ẩn dữ liệu / kiểu / triển khai. Và để cho người gọi chỉ nhìn thấy giao diện khi tạo một đối tượng, chúng ta có thể khai báo một phương thức xuất xưởng trong tiêu đề của giao diện.
Sự so sánh là:
Chi phí :
Chi phí cách giao diện thấp hơn, bởi vì bạn thậm chí không cần lặp lại việc thực hiện chức năng trình bao bọc công khai
void Bar::doWork() { return m_impl->doWork(); }
, bạn chỉ cần xác định chữ ký trong giao diện.Hiểu rõ :
Công nghệ giao diện được hiểu rõ hơn bởi mọi nhà phát triển C ++.
Hiệu suất :
Hiệu suất cách giao diện không tệ hơn thành ngữ PImpl, cả truy cập bộ nhớ bổ sung. Tôi giả sử hiệu suất là như nhau.
Sau đây là mã giả để minh họa câu hỏi của tôi:
// Forward declaration can help you avoid include BarImpl header, and those included in BarImpl header.
class BarImpl;
class Bar
{
public:
// public functions
void doWork();
private:
// You don't need to compile Bar.cpp after changing the implementation in BarImpl.cpp
BarImpl* m_impl;
};
Mục đích tương tự có thể được thực hiện bằng giao diện:
// Bar.h
class IBar
{
public:
virtual ~IBar(){}
// public functions
virtual void doWork() = 0;
};
// to only expose the interface instead of class name to caller
IBar* createObject();
Vậy quan điểm của PImpl là gì?
Impl
lớp sẽ không phá vỡABI
, nhưng thêm chức năng công cộng trong giao diện sẽ phá vỡABI
.