생성자, 소멸자를 호출하는 타입의 변수를 선언하는 경우 두 가지 비용이 발생한다.
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;
}
사실 조금 생각해보면 좀 허무하기도하고 당연한 코드이긴 한데, 습관화 하는게 중요한 부분이라 생각이 된다.
'C++' 카테고리의 다른 글
[C++/STL] vector의 크기, length 를 구하는 방법 (0) | 2021.11.29 |
---|---|
C++ 에서 구조체를 초기화 하는 여러가지 방법 (0) | 2021.07.29 |
[Effective C++] 상속받은 비가상 함수를 파생클래스에서 재정의 하지 말자 (0) | 2021.06.11 |
[Effective C++] public 상속 모형은 반드시 "is-a" 를 따른다. (0) | 2021.06.05 |
[Effective C++] 내부에서 사용하는 객체에 대한 핸들은 반환하지 말자 (0) | 2021.06.02 |