5. Implementations

C++의 구현 관련 명심할 점을 알아보자.

26. Postpone variable definitions as long as possible.

변수 선언과 정의는 최대한 늦춰라. 쓰여지는 시점과 동시에 정의하는 것이 가장 낫다. 루프 안에서 계속 초기화/복제되는 클래스 같은 경우는 예외이다.

  • 변수 정의를 최대한 늦춰라. 이는 프로그램을 더 명확하게 하고 더 효율적이게 한다.

27. Minimize casting.

캐스팅을 최소화하라. 캐스팅은 타입 시스템을 망가뜨리고, 효율성을 낮춘다.

  • 가능한 한 캐스팅을 피하라. 특히 성능이 중요한 코드에서는 dynamic_cast를 피하라. 설계가 캐스팅을 필요로 한다면 캐스팅 없는 대안을 생각하라.
  • 캐스팅을 필요로 한다면 함수 안에 숨겨라. 그러면 클라이언트들이 캐스팅 없이 함수 호출을 할 수 있다.
  • C 스타일 캐스팅 대신 C++ 스타일 캐스팅을 사용하라. 더 명확하고 찾기 쉽다.

28. Avoid returning “handles” to object internals.

오브젝트 내부에 대한 핸들러를 리턴하는 것을 피하라. 그런 리턴은 캡슐화를 망가뜨린다.

  • 오브젝트 내부에 대한 핸들러 (포인터, 참조자, 반복자) 등을 리턴하는 것을 피하라. 이는 캡슐화를 도와주고, const 멤버 함수의 const 조건을 도와주고, 댕글링 핸들러를 피하게 해 준다.

29. Strive for exception-safe code.

예외가 던져졌을 때 자원을 누수하지 말라. 자료 구조가 망가진 상태로 두게 하지 말라. 적어도 3가지 조건 중 하나를 만족시켜라. 1. 예외가 던져져도 프로그램이 올바른 상태에 놓인다. 2. 예외가 던져지면 프로그램의 상태가 바뀌지 않는다. 3. 예외를 던지지 않는다.

2번의 조건을 만족시키기 위한 방법으로는 복제 후 교환 방법이 있다. 이를 위해 pimpl 이디엄을 쓰기도 한다. 2번이 적합하지 않을 때에는 1번 조건을 만족시켜라.

  • 예외로부터 안전한 함수는 예외가 던져졌을 때도 자원을 누수하지 않고 자료 구조를 망가진 상태로 두게 하지 않는다. 이러한 함수들은 기본적, 강한 또는 예외를 던지지 않는 보장을 한다.
  • 강한 보장은 복제 후 교환 방법이 있지만, 모든 함수에 대해 실용적인 건 아니다.
  • 함수가 하는 예외 관련 보장은 그 함수가 호출하는 다른 함수들이 하는 보장 중 가장 약한 보장으로 하향평준화된다.

30. Understand the ins and outs of inlining.

인라이닝은 장점도 있지만 코드 사이즈를 크게 하기도 한다. 또한, 주소를 취한 함수나 가상 함수는 인라인될 수 없다. 인라인 함수를 수정하면 그 함수를 쓴 코드 전체가 재컴파일되어야 한다.

  • 자주 사용되는 작은 함수들만 인라인하라. 이는 디버깅과 바이너리 업그레이드 가능성을 용이하게 하고, 프로그램 성능의 잠재력을 높이고 코드 크기의 잠재력을 줄여 준다.
  • 함수 템플릿이 헤더에 있다는 이유만으로 inline을 하지 마라.

31. Minimize compilation dependencies between files.

pimpl 이디엄을 이용해 컴파일 의존성을 줄이라. 오브젝트 참조자나 포인터가 작업을 할 수 있다면 그렇게 함으로써 오브젝트의 구현과 인터페이스를 분리하라. 가능하다면, 클래스 정의부 대신 클래스 선언부에 의존하라. 정의부와 선언부를 위한 별개의 헤더를 둬라. 핸들러 클래스와 인터페이스 클래스를 둬서 구현과 인터페이스를 분리하라.

  • 컴파일 의존성을 최소화하는 법은 정의부 대신 선언부에 의존하는 것이다. 여기에 기반한 아이디어는 핸들 클래스와 인터페이스 클래스가 있다.
  • 라이브러리 헤더는 선언부만 갖고 있어야 한다. 이는 템플릿이 포함되어 있든 아니든 마찬가지다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중