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

C에서 지역 변수를 반환할 때 NRVO(명명된 반환 값 최적화)를 활용하여 복사 생성 및 파괴를 방지합니까?

Susan Sarandon
풀어 주다: 2024-11-10 02:21:02
원래의
396명이 탐색했습니다.

Does Returning a Local Variable in C   Utilize Named Return Value Optimization (NRVO) to Avoid Copy Construction and Destruction?

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

소개:
이 질문은 C에서 지역 변수를 반환하는 동작을 조사합니다. 구체적으로 반환된 객체가 복사본인지 원본 객체인지, 그리고 이것이 지역 변수의 소멸에 어떤 영향을 미치는지 탐색합니다.

반환 값 최적화(NRVO):
NRVO(명명된 반환 값 최적화)가 활성화되면 컴파일러는 불필요한 복사 생성이나 지역 변수의 소멸을 방지하기 위해 return 문을 최적화합니다. 이는 반환 개체를 대상 저장소에 직접 구성하여 중간 복사 또는 이동의 오버헤드를 제거함으로써 이를 달성합니다. NRVO는 자동 저장 기간이 있고 반환 유형과 동일한 유형인 지역 변수와 같은 특정 조건이 충족될 때 적용됩니다.

NRVO가 활성화된 예:
다음을 고려하세요. 다음 코드:

class Test {
public:
    Test(int p) { std::cout << "Constructor called" << std::endl; }
    ~Test() { std::cout << "Destructor called" << std::endl; }
};

Test function() {
    Test t(5);  // local variable with automatic storage duration
    return t;    // return local variable
}

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

NRVO가 활성화되면 출력은 be:

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가 없으면 복사 생성 및 소멸 단계가 명시적으로 수행되어 잠재적으로 생성자와 소멸자를 여러 번 호출할 수 있습니다.

위 내용은 C에서 지역 변수를 반환할 때 NRVO(명명된 반환 값 최적화)를 활용하여 복사 생성 및 파괴를 방지합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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