[ Effective C++ ] 항목 26 : 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자

Minsu._.Lighting·2023년 12월 3일
0

[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "

[핵심]

" 생성 · 소멸자를 끌고 다니는 타입은 변수 정의 시 반드시 생성 · 소멸자 호출 비용을 물게 된다! "

  • 변수 정의는 늦출 수 있을 때까지 늦추자, 프로그램이 더 깔끔해지며 효울도 좋아진다!

💡 변수 정의를 최대한 늦춰보자!

  • 어떤 변수를 사용할 때가 오기 전까지 그 변수의 정의를 늦추는 것은 기본, 초기화 인자를 손에 넣기 전까지 정의를 늦출 수 있는지도 둘러보자!

- 쓰지도 않을 객체가 만들어졌다 없어지는 일 방지

- 불필요한 기본 생성자 호출 방지

- 변수의 의미가 명확해져 쓰임새를 문서화 하기 좋아진다

📌 예외에 의해 쓰이지 않는 경우

[예시 코드]

string encryptPassword(const string& password)
{
    string encrypted;
    
    if(password.length() <MinimumPasswordLength)
    {
    	throw logic_error("패스워드가 너무 짧아");
    }
    ...
    
    return encryted;
}
  • 변수 선언 전 예외가 발생하면 변수는 쓰이지 않게 된다.
    - 예외가 발생해도 변수의 생성, 소멸 비용을 지불해야 함

📌 변수 정의를 최대한 늦춰지만, 초기화 인자가 없는 경우

[예시 코드]

string encryptPassword(const string& password)
{
	...
    
    string encrypted;
    encrypted = password;
    
    encrypt(encrypted);
    return encryted;
}

📌 해결 방법

[예시 코드]

string encryptPassword(const string& password)
{
	...
    
    string encrypted(password);
    
    encrypt(encrypted);
    return encryted;
}

📢 루프 안에서 쓰이는 변수의 경우에는...?

  • A 방법 : 루프 바깥 변수 정의, 루프 안 대입
Widget w;
for (int i = 0; i < n; ++i)
{
	w = i;
};
  • B 방법 : 루프 안 변수 정의와 동시에 초기화
for (int i = 0; i < n; ++i)
{
	Widget w(i);
};

[ 비용 비교 ]
A 방법 : 생성자 1번, 소멸자 1번, 대입 n번
B 방법 : 생성자 n번, 소멸자 n번

  • 대입에 들어가는 비용이 생성 · 소멸자 보다 적게 나온다면 A방법, 반대의 경우 B방법이 효율이 좋다!

  • A방법이 B방법보다 변수의 유효범위가 늘어나 프로그램 이해도, 유지보수 측면에서 좋지 못함!
profile
오코완~😤😤

0개의 댓글

관련 채용 정보