스토리텔링 개발자

[Effective C++] 26. 필요한 시점 직전에 변수를 정의할 것 본문

개발/Effective C++

[Effective C++] 26. 필요한 시점 직전에 변수를 정의할 것

김디트 2024. 6. 20. 10:55
728x90

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

 

 

 

생성자, 소멸자 비용 문제
  • 생성자 / 소멸자가 있는 타입의 변수는 아래의 비용이 든다.
    1. 프로그램 제어 흐름이 변수의 정의에 닿을 때 생성자가 호출되는 비용
    2. 변수가 유효범위를 벗어날 때 소멸자가 호출되는 비용
  • 정의만 되고 사용되지 않은 경우에도 비용이 부과된다는 점이 문제이다.
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;
      }
    • 기본 생성자 호출 역시 불필요하므로, 변수를 정의함과 동시에 복사 생성자로 초기화 해주어 비용을 줄인다.

 

 

 

루프에선 언제 정의할 것인가?
  • 루트 안 / 루트 밖 중에서 어디에 선언하는 것이 좋을까?
    1. 루트 안에 정의한 변수
      • 생성자 n번 + 소멸자 n번
    2. 루트 밖에 정의한 변수
      • 생성자 1번 + 소멸자 1번 + 대입 n번 
  • 대입 비용과 생성자 / 소멸자의 비용을 비교하여 더 효율이 좋은 쪽을 선택한다.
  • 1번 방법이 유효범위가 좁기 때문에 이해도와 유지보수성이 더 좋다.
  • 결론적으로 수행 성능에 민감한 사항이 아니라면 1번 방법으로 가는 것이 좋을 것이다.
728x90
Comments