일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- implicit conversion
- 다형성
- Effective c++
- 메타테이블
- 참조자
- operator new
- 루아
- 예외
- exception
- 영화 리뷰
- 오블완
- 언리얼
- effective stl
- Smart Pointer
- resource management class
- virtual function
- reference
- Vector
- 티스토리챌린지
- more effective c++
- 비교 함수 객체
- 게임
- c++
- 반복자
- 상속
- 영화
- 스마트 포인터
- lua
- UE4
- 암시적 변환
Archives
- Today
- Total
스토리텔링 개발자
[Effective C++] 26. 필요한 시점 직전에 변수를 정의할 것 본문
728x90
항목 26 : 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자
생성자, 소멸자 비용 문제
- 생성자 / 소멸자가 있는 타입의 변수는 아래의 비용이 든다.
- 프로그램 제어 흐름이 변수의 정의에 닿을 때 생성자가 호출되는 비용
- 변수가 유효범위를 벗어날 때 소멸자가 호출되는 비용
- 정의만 되고 사용되지 않은 경우에도 비용이 부과된다는 점이 문제이다.
string encryptPassword(const string& password)
{
string encrypted;
if(password.length() < MinimumPasswordLength)
{
// 여기서 예외를 던지면, encrypted는 정의만 된 채 사용되지 않는다.
// 즉 생성자, 소멸자 비용이 부과되나 사용되지 않는다.
throw logic_error("Password is to short");
}
// 즉, 이처럼 실제로 사용되기 직전 정의되는 것이 좋을 것이다.
// string encrypted;
...
return encrypted;
}
생성자, 소멸자 비용 줄이기
- 변수를 사용해야 할 때가 오기 전까지 그 변수의 정의를 늦춘다.
- 그에 더해 변수의 초기화 인자를 획득하는 시점까지 정의를 늦춘다.
-
string encryptPassword(const string& password) { ... // 길이 점검 예외처리 string encrypted(password); // 변수를 정의함과 동시에 초기화.(복사생성자 사용) encrypt(encrypted); return encrypted; }
- 기본 생성자 호출 역시 불필요하므로, 변수를 정의함과 동시에 복사 생성자로 초기화 해주어 비용을 줄인다.
-
루프에선 언제 정의할 것인가?
- 루트 안 / 루트 밖 중에서 어디에 선언하는 것이 좋을까?
- 루트 안에 정의한 변수
- 생성자 n번 + 소멸자 n번
- 루트 밖에 정의한 변수
- 생성자 1번 + 소멸자 1번 + 대입 n번
- 루트 안에 정의한 변수
- 대입 비용과 생성자 / 소멸자의 비용을 비교하여 더 효율이 좋은 쪽을 선택한다.
- 1번 방법이 유효범위가 좁기 때문에 이해도와 유지보수성이 더 좋다.
- 결론적으로 수행 성능에 민감한 사항이 아니라면 1번 방법으로 가는 것이 좋을 것이다.
728x90
'개발 > Effective C++' 카테고리의 다른 글
[Effective C++] 28. 클래스 내부 private 객체에 대한 핸들 리턴 문제 (0) | 2024.06.24 |
---|---|
[Effective C++] 27. 캐스팅 (0) | 2024.06.21 |
[Effective C++] 25. 예외를 던지지 않는 swap 함수 (0) | 2024.06.19 |
[Effective C++] 24. 비멤버 함수 구현으로 암시적 변환 지원 (0) | 2024.06.18 |
[Effective C++] 23. 비멤버 비프렌드 함수 (0) | 2024.06.18 |
Comments