임시 객체는 이름없이 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
피드 구독하기:
댓글 (Atom)
[C++] meta programing
재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...
-
Smart Pointer : 포인터처럼 동작하며 자동으로 메모리를 해제하고 안전하게 resource를 관리하도록 돕는 객체 포인터는 소멸자가 호출되지 않아 memory leak이 발생한다. Java, C#같은 VM이 있는 언어는 VM에서 G...
-
nullptr 란? C++11 에서 지원하는 null pointer 상수 먼저 pointer 가 초기화될 수 있는 정수 값을 살펴보자. 정수 0은 모든 타입의 포인터에 암시적 형변환을 통해서 초기화 값으로 사용될 수 있다. 하지만 그 이...
-
자료 구조를 순회하여 데이터에 접근하는 방법을 살펴보자. Container 에 저장된 데이터에 접근하기 위해 대표적으로 Iterator의 begin(), end() function 을 사용한다. 하지만 위 예제에서 show() 함수에 배열이...
댓글 없음:
댓글 쓰기