1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*객체를 반환할 때의 임시변수는 언제 죽는걸까*/
#include <iostream>
using namespace std;
 
class Mine {
private:
    int num;
public:
    Mine(int n) : num(n) {
        cout << "New object:    " << this << endl;
    }
    Mine(const Mine& src) : num(src.num) {
        cout << "new COPY obj:    " << this << endl;
    }
    ~Mine() {
        cout << "destroy obj:    " << this << endl;
    }
};
 
Mine func(Mine input)
{
    cout << "para input:    " << &input << endl;
    return input;
}
 
int main() {
    Mine obj(7);
    func(obj);
 
    cout << endl;
    Mine tempRef = func(obj); 
    //새 변수tempRef를 만들고 임시객체를 복사해서 넣는 거 같지만  
    //사실은 임시객체에 tempRef라는 이름을 할당한다. 
    //    그래서 func(obj)에 의해 만들어진 임시객체의 주소와
    //    tempRef의 주소가 동일하다. 이건 뭐 컴파일러 최적화인가?
    cout << "Return obj    " << &tempRef << endl;
 
    return 0;
}
 
/* 출력결과
New object:    00D6FB58     27행: 
new COPY obj:   00D6FA3C    28행:    func의 매개변수 input을 위해 임시객체 할당하고 obj로 초기화
para input:     00D6FA3C    22행: 
new COPY obj:    00D6FA74   23행:    반환을 위한 임시객체를 할당하고 input으로 초기화한다
destroy obj:    00D6FA3C    :매개변수 input 소멸
destroy obj:     00D6FA74   :반환을 위한 임시객체 소멸 (반환해놓고 멍떄리는 허졷질 함수호출이라서) 

new COPY obj:   00D6FA3C    31행:    func의 매개변수 input을 위해 임시객체 할당하고 obj로 초기화
para input:     00D6FA3C    22행:
new COPY obj:     00D6FB4C  26행:    반환을 위한 임시객체를 할당하고 input으로 초기화한다
destroy obj:    00D6FA3C    :매개변수 input 소멸
Return obj        00D6FB4C  ■36행    ■31행에서 새 변수를 만드는거 같지만 사실 안만들지롱.
destroy obj:      00D6FB4C  프로그램을 종료한다
destroy obj:   00D6FB58     종료한다 짜샤
*/
cs

윤성우씨가 이런걸 시키는군요

근데

Mine tempRef = func(obj); 

이거 왜 변수 생성 안 함? 컴파일러가 알아서 최적화한겁니까?