2013-11-27 4 views
1

예 :할당 연산자에 RVO가 발생하지 않는 이유는 무엇입니까? (C++)

A myfunction() { return A(); } 
A a = myfunction(); // default ctor only (return value optimization) 
a = myfunction(); // default ctor and operator= 

왜 컴파일러는 단지 기존 개체에 새 개체를 쓸 수 없습니다? 클래스의 모든 인스턴스가 동일한 양의 (동적이지 않은) 메모리를 차지한다고 생각합니다. 그래서 이것이 왜 문제가되는지 알지 못합니다.

+0

당신은 왜 컴파일러 그냥 A'가 현재 소유하고 어떤 자원'기존 개체? * ... 그리고 누출에 새 개체를 쓸 수 없습니다 (11) – aaronman

+4

* C++를 사용하고, 당신이 최적화가 켜져 있습니까? – Praetorian

+0

일부 컴파일러는 생성자, 할당 연산자 및 소멸자가 컴파일러에서 생성되거나 일부 경우 사소한 경우가있을 수 있습니다. – user964970

답변

5

망막 정맥 폐쇄는 C++ 표준 컴파일러에게 복사 생성자 및 최적화가 적용되면 일어나지 않을 것이다, 임시의 소멸자의 부작용을 무시하는 특별한 라이센스를 제공에만 있기 때문에 발생합니다.

가 할당 연산자의 부작용을 무시 이러한 특별한 라이센스가 없으므로이 생략 될 수 없다. 또한 a이 할당되기 전에 유효하기 때문에 새로운 개체를 제자리에 구성 할 수 있도록 먼저 destructed해야합니다. 뿐만 아니라 거기에 부작용을 무시할 수있는 특별한 라이센스가 없습니다 도입이 소멸자 전화에 의해, 그게 더 파괴가 함수 호출하기 전에 일어날 것입니다, 그리고 당신은 어디에 던져 버릴 것입니다 함수가 던졌습니다?

4

RVO는 호출자의 스택 프레임에 반환 값을 구성하여 작동합니다. 아직 어떠한 물체가 없기 때문에 제 경우

, 그것은, a의 저장에 직접 구성 될 수있다. 두 번째 경우

는 이미 객체가, 그래서 a에 할당되기 전에 다른 곳에서 구성해야합니다. a 위에 새 객체를 만들 수 없습니다. 이는 할당 방법이 작동하지 않기 때문입니다.

+0

-1 : 첫 번째 경우는 할당이 전혀 없습니다. 호출 할 수 있는지 (호출되지는 않지만) 체크되는 것은 할당 생성자가 아니라 복사 생성자입니다. – 6502

+0

@ 6502 왜 -1일까요? Mike는 첫 사례가 배정 된 것에 대해 아무 말도하지 않습니다. 그가 명시 적으로 그것이 아니라고 말하지 않는다면, 그것은 질문에서 분명하지 않기 때문입니다. –

+3

@ 6502 : 사실, 첫 번째 경우는 과제가 아니므로 그 이유는 무엇이라고 말하지 않았습니다. –