반응형
Effective C++ 항목4
: 객체를 사용하기 전에 반드시 그 객체를 초기화하자
클래스의 멤버 변수를 초기화할 때
- 생성자 등 함수의 구현 부에서 값을 대입하면?
- => 기본 생성자 호출 후, 복사 대입 생성자가 호출되어 런타임 시간이 더 걸린다. (비효율적!)
- 멤버 초기화 리스트(이니셜라이저)를 사용하면?
- => 초기화와 동시에 값 복사된다.
- => 복사 생성자만 호출되므로 보다 효율적!
- 상수와 참조자로 되어있는 멤버 변수는 반드시 초기화 되어야함
- 갖가지 경우를 모두 기억하기 보다는 멤버 초기화 리스트를 사용하는 것이 안전!
- 멤버 초기화 리스트 순서는 멤버 변수 선언 순서와 동일하게 가야 유지보수 편리
- 객체를 구성하는 데이터 초기화 순서는?
- 기본 클래스는 파생 클래스보다 먼저 초기화
- 클래스 데이터 멤버는 그들이 선언된 순서대로 초기화
- 비지역 정적 객체(non-local static object, 이하 NLSO)의 초기화 순서는 개별 번역 단위에서 정해진다. (초기화 순서가 정해져 있지 않다!)
- 정적 객체란?
- 전역 객체 / 네임스페이스 유효범위에서 정의된 객체 / 클래스 내에 static선언된 객체 / 함수 내 static선언된 객체 / 파일 유효범위에서 static 정의된 객체
- 문제 발생 : 서로 다른 소스 파일의 NLSO끼리 사용된다면?
- 사용되는 NLSO가 초기화 되지 않았을 수도 있다!
- 해결책 => NLSO를 클래스 내에서 "정적 객체로 선언하고 참조자를 반환하는" 참조자 반환 함수를 만들면 된다. (=싱글턴 패턴의 구현양식)
- 추가 문제 : 참조자 반환 함수는 내부적으로 정적 객체를 쓰기 때문에, 다중스레드 상황에서 문제 야기 가능
- 해결책 => 다중스레드 돌입 전에 참조자 반환 함수를 호출하여 race condition 방지
- 추가 문제 : 참조자 반환 함수는 내부적으로 정적 객체를 쓰기 때문에, 다중스레드 상황에서 문제 야기 가능
- 정적 객체란?
반응형
'Book & Lecture > Effective C++' 카테고리의 다른 글
Effective C++ 항목8 : 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 (0) | 2023.02.06 |
---|---|
Effective C++ 항목7 : 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자. (0) | 2023.02.05 |
Effective C++ 항목6 : 컴파일러가 만들어낸 함수가 필요 없다면 사용을 금지하자 (0) | 2023.01.27 |
Effective C++ 항목5 : 컴파일러가 기본으로 만드는 함수들에 촉각을 세우자 (0) | 2023.01.26 |
Effective C++ 항목1~3 정리 요약 (0) | 2023.01.24 |