생성자 or 소멸자 호출 타입으로 변수정의시 비용발생한다. 쓰지도 않는데 비용이 발생하면 낭비이다.
* 예시
string encryptPassword(const string& password)
{
string encrypted; // 생성자 호출 비용이 발생하는 타입의 변수
if(password.length() < MinimumPasswordLength) {
throw logic_error("password is too short");
}
… // encrypted 변수를 사용하는 부분, 하지만 위에서 예외발생시 encrypted변수는 쓰이지 않으며, 비용만 발생한다.
return encrypted;
}
* 개선된 코드
string encryptPassword(const string& password)
{
… //길이점검 루틴 위와동일
string encrypted; // 변수의 정의를 늦추긴했지만 여전히 비효율적!! 왜
encrypted = password;
// 생성자호출 + 대입연산자 비용 발생 -> 한번에 초기화해버리는 방법이 좋을것같다. 항목 4. 참조
encrypt(encrypted);
return encrypted;
}
* 추가개선코드
string encryptPassword(const string& password)
{
… //길이점검 루틴 위와동일
string encrypted(password):
encrypt(encrypted); // 복사생성자만 비용발생 위 코드보다 효율적
return encrypted;
}
* 루프의 경우는?
// case 1
Widget w;
for(int i = 0; i<n; ++i) {
w = i;
…
}
// case 2
for(int I = 0 ; i<n; ++i) {
Widget w;
w = i;
…
}
case 1. 생성자 1번 + 소멸자 1번 + 대입 n번
case 2. 생성자 n번 + 소멸자 n번
요약정리
- 변수정의는 최대한 늦추자. 프로그램도 깔끔해지며 효율도 좋아진다.
'책 정리 > Effective C++ 3rd' 카테고리의 다른 글
항목 28. 내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자 (0) | 2020.02.04 |
---|---|
항목 27. 캐스팅은 절약, 또 절약! 잊지 말자 (0) | 2020.02.03 |
항목 25. 예외를 던지지 않는 swap에 대한 지원도 생각해보자 (0) | 2020.01.13 |
항목 24. 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자 (0) | 2020.01.10 |
항목 23. 멤버함수 보다는 비멤버 비프렌드 함수와 더 가까워지자 (0) | 2020.01.09 |
댓글