C ++에서 PImpl 관용구를 사용하는 많은 소스 코드가 보입니다. 개인 데이터 / 유형 / 구현을 숨기고 의존성을 제거한 다음 컴파일 시간과 헤더 포함 문제를 줄이는 것이 목적이라고 가정합니다.
그러나 C ++의 인터페이스 / 순수한 클래스에도이 기능이 있으며 데이터 / 유형 / 구현을 숨길 수 있습니다. 그리고 객체를 생성 할 때 호출자가 인터페이스를 볼 수있게하기 위해 인터페이스 헤더에 팩토리 메소드를 선언 할 수 있습니다.
비교는 다음과 같습니다.
비용 :
공용 래퍼 함수 구현을 반복 할 필요가 없기 때문에 인터페이스 방식 비용이 저렴
void Bar::doWork() { return m_impl->doWork(); }
합니다. 인터페이스에서 서명 만 정의하면됩니다.잘 이해 :
인터페이스 기술은 모든 C ++ 개발자가 더 잘 이해합니다.
성능 :
인터페이스 방식 성능은 추가 메모리 액세스 인 PImpl 관용구보다 나쁘지 않습니다. 성능이 같다고 가정합니다.
다음은 내 질문을 설명하는 의사 코드입니다.
// 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;
};
인터페이스를 사용하여 동일한 목적을 구현할 수 있습니다.
// 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();
PImpl의 요점은 무엇입니까?
Impl
클래스에 public 함수를 추가 해도는 깨지지ABI
않지만 인터페이스에 public 함수를 추가하면 깨ABI
집니다.