임시객체 : 객체를 인수로 사용하거나 반환할 때 임시로 생기는 객체
임시객체 생성 시점
- 인수로 사용할 때,
- 함수에서 반환할 때
cf. 임시객체를 인수로 사용시에는 컴파일러가 자동으로 최적화를 하여서 임시객체 다시 만들고 지우는 것 없이 그대로 전달 됨.
ex.
class CObj
{
public:
CObj Func(CObj Obj)
{
return Obj;
}
};
void main(void)
{
CObj Obj;
Func(Func(Obj));
}
- 함수 호출될 때 마다 지우고 삭제 하는 것 없이 반환된 임시 객체가 그대로 쓰임
- 함수 호출 -> 임시객체1 생성(인수) ->임시객체2 생성(반환1) -> 임시객체 1 소멸 -> 반환 -> 함수호출(임시객체2가 그대로 레퍼런스 처럼 인수타고 함수로 들어감) -> 임시객체3 생성(반환2) -> 반환 -> 임시객체 2 소멸, 임시객체 3 소멸
- 따라서 복사 생성자 호출 3번, 소멸자 호출 3번
- CObj Func(CObj& Obj) 라면 인수 사용시에 생성되는 임시 객체가 없으므로 두 번
- CObj& Func(CObj Obj) 인 경우에도 임시 객체가 두 번 생성 됨 (위와는 순서는 다름)
소멸 시점
- 인수로 사용할 경우 함수 끝나면
- 반환한 것을 레퍼런스로 사용하는 경우나 인수로 사용하는 경우 -> 사용이 끝나는 시점
※인수로 사용한 것을 레퍼런스로 반환해서 인수로 사용될 경우
이걸 다시 레퍼런스 인수로 받으면 다음 함수 호출 시점엔 이미 사라져있는 것을
볼 수 있음 (인수 자체는 스코프가 함수안으로만 돼있으므로 어차피 잘못된 사용)
'programing > C++' 카테고리의 다른 글
[Modern C++] 람다 함수 & decltype (0) | 2016.08.16 |
---|---|
erase()와 remove() 차이 (1) | 2016.08.04 |
INI 파일 함수 (0) | 2015.06.09 |
Registry 자료형, 함수 (0) | 2015.06.09 |
형 변환 (type cast) (0) | 2015.06.09 |