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

NRVO(명명된 반환 값 최적화)는 지역 변수 반환 동작에 어떤 영향을 줍니까?

Barbara Streisand
풀어 주다: 2024-11-09 09:03:02
원래의
740명이 탐색했습니다.

How Does Named Return Value Optimization (NRVO) Affect Local Variable Return Behavior?

지역 변수의 반환 동작 이해

함수에서 지역 변수를 반환할 때 해당 동작은 컴파일러 최적화에 따라 달라질 수 있습니다.

NRVO(명명된 반환 값 최적화)

NRVO가 활성화되면 컴파일러는 반환 값 사이트에서 직접 반환되는 개체를 생성하여 반환 문을 최적화합니다. 이 경우 복사가 수행되지 않으며 반환 후 원본 개체가 삭제됩니다.

NRVO가 활성화된 출력

// With NRVO enabled, only one constructor and destructor call is made.
class test {
public:
  test(int p) {
    std::cout << "Constructor (test(int p)) called\n";
  }

  ~test() {
    std::cout << "Destructor called\n";
  }
};

test function() {
  test i(8);
  return i;
}

int main() {
  test o = function();
  return 0;
}
로그인 후 복사

출력:

Constructor (test(int p)) called
Destructor called
로그인 후 복사

NRVO 비활성화

NRVO를 비활성화하려면 컴파일 중에 -fno-elide-constructors 플래그를 사용하세요. 이 경우 컴파일러는 NRVO를 수행하지 않으며 반환 값에 객체의 복사본이 생성됩니다.

NRVO 비활성화 상태로 출력

// With NRVO disabled, both constructor and destructor calls are made twice.
class test {
public:
  test(int p) {
    std::cout << "Constructor (test(int p)) called\n";
  }

  test(test&& other) {
    std::cout << "Constructor (test(test&& other)) called\n";
  }

  ~test() {
    std::cout << "Destructor called\n";
  }
};

test function() {
  test i(8);
  return i;
}

int main() {
  test o = function();
  return 0;
}
로그인 후 복사

출력 :

Constructor (test(int p)) called
Constructor (test(test&& other)) called
Destructor called
Destructor called
로그인 후 복사

요약

  • NRVO를 활성화하면 로컬 변수를 반환하면 복사본이 필요 없고 반환 사이트에서 개체를 직접 구성합니다. 원본 개체를 즉시 삭제합니다.
  • NRVO를 비활성화하면 개체의 복사본이 생성되고 반환되어 개체의 복사본 두 개가 생성됩니다.

위 내용은 NRVO(명명된 반환 값 최적화)는 지역 변수 반환 동작에 어떤 영향을 줍니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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