그래서이 기술이 실제로 실제로 사용되는 것이 궁금합니다. 어디서나주의해서 사용해야합니까?
물론 사용됩니다. 나는 거의 모든 수업에서 내 프로젝트에서 사용합니다.
PIMPL 관용구를 사용하는 이유 :
이진 호환성
라이브러리를 개발할 때 XImpl
클라이언트와 바이너리 호환성 을 유지 하지 않고도 필드를 추가 / 수정할 수 있습니다 (충돌을 의미합니다). X
클래스에 새 필드를 추가 할 때 클래스 의 이진 레이아웃이 변경되지 않으므로 Ximpl
부 버전 업데이트에서 라이브러리에 새 기능을 추가하는 것이 안전합니다.
물론, 당신은 또한 새로운 공개 / 개인 가상이 아닌 방법을 추가 할 수 있습니다 X
/ XImpl
이진 호환성을 깨지 않고 있지만, 표준 헤더 / 구현 기술로 파에 그의.
데이터 숨기기
라이브러리, 특히 독점 라이브러리를 개발하는 경우 라이브러리의 공용 인터페이스를 구현하는 데 사용 된 다른 라이브러리 / 구현 기술을 공개하지 않는 것이 좋습니다. 지적 재산권 문제로 인해 또는 사용자가 구현에 대해 위험한 가정을 취하려고 유혹하거나 끔찍한 캐스팅 트릭을 사용하여 캡슐화를 깨뜨릴 수 있다고 생각하기 때문입니다. PIMPL은이를 해결 / 완화합니다.
컴파일 시간
X
필드 및 / 또는 메소드를 XImpl
클래스에 추가 / 제거 할 때 소스 파일 (구현) 파일 만 다시 빌드하면 되므로 컴파일 시간이 단축됩니다 (표준 기술에서 개인 필드 / 메소드 추가에 맵핑 됨). 실제로는 일반적인 작업입니다.
표준 헤더 / 구현 기술 (PIMPL 제외)을 사용하여에 새 필드를 추가하면 X
할당 X
크기를 조정해야하므로 스택 (또는 스택 또는 힙)에 할당 한 모든 클라이언트를 다시 컴파일해야합니다. X 를 할당하지 않은 모든 클라이언트 도 다시 컴파일해야하지만 오버 헤드 일뿐입니다 (클라이언트 측의 결과 코드는 동일합니다).
또한 캡슐화 이유로 인해이 메소드를 호출 할 수는 없지만 XClient1.cpp
개인용 메소드 X::foo()
를 추가 X
하고 X.h
변경 한 경우에도 표준 헤더 / 구현 분리 를 다시 컴파일해야합니다 XClient1.cpp
! 위와 같이 순수한 오버 헤드이며 실제 C ++ 빌드 시스템 작동 방식과 관련이 있습니다.
물론, 메소드의 구현을 수정하는 경우 (헤더를 건드리지 않기 때문에) 재 컴파일은 필요하지 않지만 표준 헤더 / 구현 기술과 동등합니다.
이 기술을 임베디드 시스템 (성능이 매우 중요한 곳)에서 사용하도록 권장합니까?
그것은 당신의 목표가 얼마나 강력한 지에 달려 있습니다. 그러나이 질문에 대한 유일한 답은 얻는 것과 잃는 것을 측정하고 평가하는 것입니다. 또한 클라이언트가 임베디드 시스템에서 사용할 라이브러리를 게시하지 않으면 컴파일 시간 이점 만 적용된다는 점을 고려하십시오!
struct XImpl : public X
. 그것은 더 자연스러운 느낌입니다. 내가 놓친 다른 문제가 있습니까?