Copy Elision 및 Object Lifetime
지역 변수를 값으로 반환할 때 원본 객체가 소멸되는지 궁금할 수 있습니다. 대답은 복사 제거를 이해하는 데 있습니다.
복사 제거(NRVO) 사용
최적화(명명된 반환 값 최적화 또는 NRVO라고도 함)가 활성화되면 컴파일러는 다음을 수행할 수 있습니다. 개체가 복사될 스토리지에 직접 개체를 구성하여 return 문을 최적화합니다. 결과적으로 원본 개체가 애초에 생성되지 않습니다.
NRVO가 활성화된 예
다음 코드를 고려하세요.
class Test { public: Test(int p) { cout << "Constructor called" << endl; } ~Test() { cout << "Destructor called" << endl; } }; Test function() { Test t(5); return t; } int main() { Test o = function(); return 0; }
NRVO가 활성화되면 출력은 다음과 같습니다.
Constructor called Destructor called
객체 o만 생성 및 소멸되고 원래 객체 t는 최적화됩니다.
복사 제거 없음
최적화가 비활성화된 경우(예: -fno-elide-constructors) 반환 문은 일반적인 복사/이동 의미 체계를 따릅니다.
NRVO 비활성화의 예
NRVO가 비활성화된 상태에서 위의 코드를 사용하면 출력은 다음과 같습니다.
Constructor called Constructor called Destructor called Destructor called
이번에는 복사/이동 구성이 불가능하므로 객체 t와 o가 모두 생성되고 삭제됩니다. 최적화하세요.
결론
값으로 지역 변수를 반환하면 원본 개체가 파괴되는지 여부는 NRVO 활성화 여부에 따라 다릅니다. NRVO를 사용하면 원본 개체가 제거될 수 있지만 NRVO가 없으면 표준 복사/이동 의미에 따라 복사/이동됩니다.
위 내용은 값으로 지역 변수를 반환하면 원래 개체가 삭제됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!