2009-03-30 5 views
15

나는 함수가 스택에서 호출하는 함수에 객체를 반환 할 때 호출하는 함수가 원래 객체의 복사본을 가져 오지만 스택이 unwind되면 바로 원래 객체의 소멸자가 호출된다고 생각했다. 그러나 다음 프로그램에서 소멸자는 한 번만 호출됩니다. 나는 그것이 두 번 부르기를 기대했다.소멸자가 함수에서 반환 된 객체에 대해 호출되지 않는 이유는 무엇입니까?

#include <iostream> 

class MyClass 
{ 
public: 
    ~MyClass() { std::cout << "destructor of MyClass" << std::endl; } 
}; 

MyClass getMyClass() 
{ 
    MyClass obj = MyClass(); 
    return obj; // dtor call for obj here? 
} 

int main() 
{ 
    MyClass myobj = getMyClass(); 
    return 0; // Another dtor call for myobj. 
} 

그러나 "소멸자 MyClass"는 한 번만 인쇄됩니다. 내 가정이 잘못되었거나 여기에 다른 일이 있습니까?

+0

왜 작성 하시겠습니까? "MyClass obj = MyClass();" ? "MyClass obj;" 잘 할거야. 이것은 자바가 아닙니다;). –

+0

그렇습니다. 자바 프로그래밍이 많이 있기 때문입니다. – Srikanth

+0

@EvanTeran "왜 MyClass obj = MyClass();" "MyClass obj;"는 "이것들은 ** ** 않습니다. 일반적으로 동급. – curiousguy

답변

21

이것은 컴파일러가 복사본을 최적화 할 수있는 특별한 경우입니다. named return value optimization (NRVO)입니다. 기본적으로 컴파일러는 호출 사이트의 반환 객체에 메모리를 할당하고 호출 된 사이트에서 객체를 만들고 다시 복사하는 대신 해당 메모리에 함수를 직접 채울 수 있습니다. 현대의 컴파일러는 가능할 때마다이를 일상적으로 수행합니다 (이 경우 개의 다른 인스턴스를 반환하는 함수의 반환 경로가 여러 개 있기 때문에 쉽지 않은 경우가 있습니다).

관련 문제