> 백엔드 개발 > C++ > 값으로 지역 변수를 반환하면 원래 개체가 삭제됩니까?

값으로 지역 변수를 반환하면 원래 개체가 삭제됩니까?

DDD
풀어 주다: 2024-11-09 13:15:02
원래의
853명이 탐색했습니다.

Does Returning a Local Variable by Value Destroy the Original Object?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿