본문 바로가기
C++

[Effective C++] 변수의 정의는 최대한 늦추자

by Warehaus 2021. 6. 1.

생성자, 소멸자를 호출하는 타입의 변수를 선언하는 경우 두 가지 비용이 발생한다.

1. 처음 정의 시 변수가 호출하는 생성자 비용

2. 변수가 유효범위를 벗어날 때 호출되는 소멸자

이런 비용을 최대한 피하기 위해서는 정말 꼭 필요할 위치에서 변수를 호출해 줘야 하며, 그 차이는 아래 코드를 보면 알 수 있다.

// error로 인해 사용하지 않더라도 msg 가 생성된다.
std::string ErrorMsgGenerator( std::string  code )
{
    std::string msg;
    
    if ( code < 1 )
        throw error( "invalid code" );
    
    return msg;
}

// string 생성을 최대한 늦게 한다.
std::string ErrorMsgGenerator( std::string  code )
{
    if ( code.length() != 1 )
        throw error( "invalid code" );
    
    std::string msg;
    
    return msg;
}

위 코드에서는 선언만을 뒤로 미뤄두었는데, 선언 뿐만 아니라 msg 를 초기화 하는 값이 생성되는 시점까지 최대한으로 미뤄 줄 수도 있을 것이다.

std::string ErrorMsgGenerator( std::string  code )
{
    if ( code.length() != 1 )
        throw error( "invalid code" );
    
    std::string msg;
    msg = getMsg( code ); // getMsg 를 통해 초기화 값을 얻었다.
    
    return msg;
}

std::string ErrorMsgGenerator( std::string  code )
{
    if ( code.length() != 1 )
        throw error( "invalid code" );
        
    // 값을 얻는 시점과 초기화 시점을 일치시켜서 최대한 선언을 미룬다
    std::string msg ( getMsg ( code ) ); 
    
    return msg;
}

사실 조금 생각해보면 좀 허무하기도하고 당연한 코드이긴 한데,  습관화 하는게 중요한 부분이라 생각이 된다.