7월 11, 2016

[EC++ 04] Make sure that objects are initialized before they're used.


  1. Initialization 규칙
  2. 일반적으로 C++의 C 부분에 해당하는 경우 자동 initializing을 보장하지 않는데, C++의 non-C 부분에 해당하는 경우엔 해주는 경우도 있음. ex)array는 초기화 X, vector는 초기화 O.
    따라서 object를 사용하기 전에는 초기화를 직접 해주고 사용해야 함.

  3. Initialization과 assignment를 헷갈리지 말 것.
  4. C++은 ctor의 body에 들어가기 전에 object를 초기화함. 가급적이면 ctor의 밖에서 true initialization (member initialization list를 사용)할 것. ctor의 body 안에서 멤버에 =operator를 사용하는 경우 initialization이 아니라 assignment가 일어나 효율이 떨어짐. built-in type의 경우 initialization과 assignment 사이에 차이가 없지만 일관성 위해 initialization 사용하는게 좋음.
    const 나 reference 같은 경우는 member initialization list를 통해서만 초기화할 수 있음.

  5. Initialization order
  6. 상속 관계 안에서는 항상 base class가 먼저, derived class가 나중에 초기화됨(ECpp 12 참조). 한 class 안에서는 member를 선언한 순서대로 초기화됨.

  7. Order of initialization of non-local static objects
    • A static object
    • 생성된 때부터 프로그램이 종료되는 순간까지 존재하는 object.

    • Translation unit
    • 하나의 object file을 만드는 source code 단위. 대게 하나의 source file과 거기에 include 된 모든 파일.

    서로 다른 translation unit 에 속해있는 non-local static object의 initialization의 상대적인 순서는 undefined. 이런 non-local static object를 상대적인 순서를 맞춰가며 초기화하는 것은 매우 어렵기 때문에, 각 non-local statice var.을 static으로 선언한 function에 넣고, function 내에서 초기화하고 var.을 refence로 반환하도록 하는 것이 좋음. (단, 멀티스레드 환경에서 이런 static object를 포함하는 function 사용 시 주의해야 함.)


Summary

  • Manually initialize objects of built-in type, because C++ only sometimes initializes them itself.
  • In a constructor, prefer use of the member initialization list to assignment inside the body of the constructor. List data members in the initialization list in the same order they're declared in the class.
  • Avoid initialization order problems across translation units by replacing non-local static objects with local static objects.

Reference

  • Effective C++ by Scott Meyers

댓글 없음:

댓글 쓰기