지역 변수를 반환하면 복사본이 반환되고 원본이 삭제됩니까(NRVO)?
소개:
질문은 C에서 지역 변수를 반환하는 동작을 조사합니다. 구체적으로, 반환된 객체가 복사본인지 원본 객체인지, 그리고 이것이 지역 변수의 소멸에 어떤 영향을 미치는지 조사합니다.
반환 값 최적화(NRVO):
NRVO(명명된 반환 값 최적화)가 활성화되면 컴파일러는 불필요한 복사 생성이나 지역 변수의 소멸을 방지하기 위해 return 문을 최적화합니다. 이는 반환 개체를 대상 저장소에 직접 구성하여 중간 복사 또는 이동의 오버헤드를 제거함으로써 이를 달성합니다. NRVO는 자동 저장 기간이 있고 반환 유형과 동일한 유형인 지역 변수와 같은 특정 조건이 충족될 때 적용됩니다.
NRVO가 활성화된 예:
다음을 고려하세요. 다음 코드:
class Test { public: Test(int p) { std::coutNRVO가 활성화되면 출력은 다음과 같습니다.
Constructor called Destructor called이 경우 NRVO는 return 문을 최적화하고 객체 o를 로컬 변수 t의 저장소에 직접 구성합니다. 생성자는 한 번 호출되고 객체 o에 대해 하나의 소멸자만 호출됩니다.
NRVO가 비활성화된 예:
그러나 -fno-elide-를 사용하여 NRVO를 비활성화할 수 있습니다. 생성자 컴파일러 플래그. NRVO가 없으면 컴파일러는 명시적으로 복사 생성 및 삭제 단계를 수행합니다.Constructor called Constructor called Destructor called Destructor called이 경우 생성자는 두 번 호출됩니다(로컬 변수 t 및 반환 객체 o에 대해). 또한 지역 변수 t와 반환 객체 o는 모두 별도로 소멸됩니다.
결론:
지역 변수 반환 동작은 NRVO가 활성화되었는지 비활성화되었는지에 따라 달라집니다. NRVO를 활성화하면 지역 변수가 최적화되고 생성자와 소멸자는 반환 개체에 대해 한 번만 호출됩니다. NRVO가 없으면 복사 생성 및 소멸 단계가 명시적으로 수행되어 잠재적으로 생성자와 소멸자를 여러 번 호출할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3