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);
이거 왜 변수 생성 안 함? 컴파일러가 알아서 최적화한겁니까?
return value optimization
volatile 쓰면 컴파일러가 안건드니까 해보셈
그렇군요