2008.10.04 11:39 책 정리/Exceptional C++

포워딩 함수가 무엇이며, 어떻게 효율적으로 구사할수 있는지에 대해서 이야기이다.

포워딩 함수란, 다른 개체나 함수등으로 일을 떠넘기는 함수를 뜻하며, 개념적으로 switch 함수라고 보면 될 것이다.

포워딩 함수의 예
bool f( X x )
{
     return g( x );
}

문제 : 어떻게 하면 효율적으로 바꿀 수 있을까?




...
..
.

1. 값을 매개변수로 넘기는 대신 const&를 매개변수로 넘기자.
이렇게 되면 불필요한 복사생성자 호출이 없어 지므로, 효율적으로 포워딩 함수를 구성 할 수가 있다. 여기에 대해서 몇가지 부수적으로 이야기가 붙여지는데, x는 f() 에서 사용되어지지 않고 g의 매개변수로써만 사용되기 때문에, 컴파일러 단계에서 최적화 시켜, 복사 생성자 호출을 제거 할수 있다.

그러면 컴파일러는 몇가지 선택사항에서 알아서 판단하여 최적화 시킬 수 있다.
1. f()에서 사용되고 g()로 넘겨지는 목적으로 사용하기 위해서 x의 복사 본을 생성함
2. g()의 매개변수로 밖에 사용되지 않는 x를 복사본을 생성하지 않고 g()로 직접 전달 함

그래서 1997년 런던 회의전에는 실제로 이랬다고 한다. 이것으로 컴파일러마다 자기 마음데로 복사생성자를 제거하게 되자, 컴파일러 특성을 타는 코드가 더 많이 생기게 되었다. 1997년을 기점으로 C++ 위원회에서는 보다 강략한 제한사항을 초안(드래프트)에 수정하게 된다. 그 후부터 반환값의 임시 개체를 삭제하는 목적을 제외하고는 복사 생성자를 제거하지 못하게 되었다.

그러므로 효율적으로 포워딩 함수를 만들고자 할 때, const &를 매개변수로 넘기면 더 좋다.


2. 언어의 잘 모르는 부분은 피하는게 더 효율적이다.
간단한 이유이다. 컴파일러에 대해서 자세히 알고 있어, 거기에 맞추어 코딩했을 때의 장점 보다 단점이 많으므로 일반적인 규칙에 맞추어 코딩을 하게 된다면, 언어의 규칙이 변하더라도, 별 영향을 받지 않게 된다. 이것은 언어의 미묘한 점(어떻게 구현해야 된다고 확정되지 않은)에 의존하여 문제를 해결할 필요가 없다는 것을 의미한다.


3. 인라인이나 세부 조정(포워딩 함수등)은 성능 프로파일이 필요하다고 입증될 때까지 피하자.
inline 함수의 단점으로는 그 함수를 사용하는 파일들은 인라인 함수가 변경되면 다시 재컴파일 되며(큰 프로젝트에선 시간이 매우 많이 소모된다), 그리고 세부 조정이 바뀌게 될 때(포워딩 함수의 매개변수가 바뀔때) 모든 코드를 다 수정해야만 한다.

결국 인라인 함수를 사용하는것과 사용하지 않는것, 포워딩 함수의 매개변수가 바뀔수 있는것과 바뀔수 없는것등을 판단해서 처리해야만 한다.

 

총평
한가지 주제로 여러가지 결론에 도달하게 된다. 잘 모르는것은 안쓰는 것 못하며, 복사 생성자 호출을 프로그래머의 센스로 줄이는게 더 좋다는 것과 인라인 함수의 단점을 다시 한번 알게 된다. 또한 스스로 연구하는 자세가 얼마나 좋은 결과(여러가지 결론을 냄으로써 일관성을 유지시키는 코딩)을 갖을 수 있는지 알게 된다.

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요