> 백엔드 개발 > C++ > 본문

C 17에서 지역 변수를 반환하면 복사본을 반환하고 원본을 삭제합니까(NRVO)?

Mary-Kate Olsen
풀어 주다: 2024-11-22 06:50:15
원래의
384명이 탐색했습니다.

Does Returning a Local Variable in C  17 Return a Copy and Destroy the Original (NRVO)?

로컬 변수를 반환하면 복사본이 반환되고 원본이 삭제됩니까(NRVO)?

C 17에서 최적화가 활성화된 경우(구체적으로 , 명명된 반환 값 최적화 또는 NRVO), 지역 변수를 반환하는 데는 원본 개체 복사가 포함되지 않습니다. 대신, 컴파일러는 코드를 최적화하여 반환된 객체를 복사될 스토리지에 직접 구성합니다. 이는 원래 객체가 반환 값 위치로 효과적으로 이동되고 소멸자가 호출되지 않음을 의미합니다.

그러나 최적화가 비활성화된 경우(-fno-elide-constructors 플래그 사용) 기본 동작을 따릅니다. :

  • 로컬 변수는 정상적으로 생성됩니다.
  • 그런 다음 로컬 변수가 이동되거나 복사됩니다(이동성에 ​​따라 다름). 반환 값 위치로 이동합니다.
  • 원래 지역 변수는 소멸됩니다.

제공한 코드에서:

test function() {
    test i(8);
    return i;
}
로그인 후 복사

NRVO가 활성화되면 하나의 생성자만 및 소멸자 호출이 관찰되어 원래 i 객체가 복사되지 않고 반환 값 위치로 이동되었음을 나타냅니다.

NRVO가 비활성화되면 원본 i 객체와 반환 값 객체 모두에 대해 생성자 및 소멸자 호출이 모두 관찰됩니다. 이는 원본 i 객체가 복사된 다음 소멸됨을 나타냅니다.

따라서 질문에 대한 대답은 다음과 같습니다. 또는 최적화가 활성화되지 않았습니다. NRVO가 활성화되면 지역 변수를 반환해도 복사본이 반환되지 않으며 원본이 삭제되지 않습니다. NRVO가 비활성화되면 복사본을 반환하고 원본을 파기합니다.

위 내용은 C 17에서 지역 변수를 반환하면 복사본을 반환하고 원본을 삭제합니까(NRVO)?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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