C++ Idiom
프로그래밍시 발생하는 문제를 해결하기 위한 기법 같은 것.
c++ 의 언어적인 특성에 기반한 팁 문제해결 패턴 같은 것들이라고 할 수 있다.
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
(다양한 기법과 패턴들이 나와있다.)
여기서는 널리 쓰이는 기법들만 소개하고자 한다.
PImpl (Pointer to Implementation)
포인터를 이용해서, 실제 구현체를 감춰두는 기법.
아래 두가지의 장점이 있다.
1) 전방 선언을 통한 컴파일 시간 단축
2) 인터페이스와 구현의 분리
실제 구현부를 인터페이스에 작성하지 않아서, 변경되더라도 인터페이스는 변경하지 않는다.
인터페이스가 변경되지 않았기 때문에 client 코드를 다시 컴파일 할 필요가 없다.
인터페이스의 객체가 구현 객체의 수명을 제어하므로 포인터는 스마트 포인터(shared ptr)를 사용하는게 유용하다.
구현 예시
헤더 파일
class impl; // forward declaration
class PIMPLClass
{
public:
PIMPLClass();
~PIMPLClass();
private:
unique_ptr pimpl; // 실제 구현부를 가리키는 포인터
};
cpp 파일
class impl { // 실제 구현부 클래스
public :
int number;
string str;
}
PIMPLClass::PIMPLClass()
: pimpl(std::make_unique())
{
}
장점
헤더에 forward declration 을 이용해서 컴파일 타임을 줄일 수 있다.
( PIMPLClass 헤더 파일을 물고 있는 코드들은 구현부를 물고 있진 않기 때문에, 구현부 변경시에 줄줄이 다 컴파일 되진 않는다.)
impl 변수가 변경되더라고 컴파일 타임은 영향을 주지 않는다.
공유 라이브러리 바이너리의 호환성 유지에 도움 ( header 에 변경이 없으므로)
단점
그러나 메모리 할당의 추가와 코드 복잡성이 추가 된다.
디버깅이 번거로워지는 것도 덤으로 붙는다.
RAII (Resource Acquisition Is Initialization)
메모리 릭이 발생하지 않게 자원 관리하자
'C++ > STL 및 기타' 카테고리의 다른 글
Move Semantic (0) | 2020.08.08 |
---|---|
vector (0) | 2020.08.05 |