2015년 10월 1일 목요일

[C++] Temporary Object

임시 객체는 이름없이 runtime에 잠시 생성되었다가 사라지는 객체를 말한다.

임시 객체는 개발자가 의도해서 생성할 수도 있지만 대부분 컴파일러의 필요에 의해서 생성된다.

primitive 말고 객체를 임시 객체로 생성되는 경우 성능에 영향을 미칠 수 있다.
그러므로 함수 안에서 객체를 지역 변수로 단순히 생성해서 반환하는 경우 임시 객체를 반환하도록 해서
임시 객체가 컴파일러에 의해 생성되지 않도록 최적화해야 한다.


먼저 main 함수에서 Int32(10); 코드는 임시 객체를 생성한다.
이 코드에서 임시객체는 main 함수가 끝나지 않았는데도, 해당 line 에서 생성되고 line 이후에는 바로 소멸된다.

cc = aa + bb; 코드에서는 aa.operator + (bb) 를 통해 임시 객체가 생성되고
이 임시객체의 복사생성자에 의해 cc 로 결과가 대입된다.

primitive type 의 경우에도 마찬가지이다.
z = a + b; 코드에서 a + b 는 임시 객체가 생성된다.
결국엔 대입 연산자 때문에 임시 객체가 생성되는데,
10 + 20 의 결과 30이 메모리상에 먼저 저장되고 이후 z에 저장된다.
premitive type 에는 임시 객체 생성/소멸이 큰 부담이 되지 않지만
user defined class 의 임시 객체 생성과 소멸은 다른 얘기가 된다.


따라서 위 예제에서는 + 연산자를 재정의한 코드를 수정함으로 써
임시객체를 바로 반환하도록 할 수 있다.


지역 변수를 생성해서 반환하는 것이 아니라, 임시 객체를 명시적으로 반환한다.
이렇게 하면 아래 cc = aa + bb 에서 임시 객체가 추가로 생성되지 않는다.
이렇게 임시 객체를 바로 반환하는 기법을 RVO(Return Value Optimization) 이라 한다.


마지막으로 임시 객체와 참조에 대해 생각해보자.

값이 아닌 참조를 전달할 경우에는 임시 객체가 생성되지 않는다.

따라서 임시 객체 생성으로 인한 성능 저하를 막기 위해서 아래 2가지 방법이 사용될 수 있다.
1. RVO
2. Return of Reference









댓글 없음:

댓글 쓰기

[C++] meta programing

재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...