지역 변수의 반환 동작 이해
함수에서 지역 변수를 반환할 때 해당 동작은 컴파일러 최적화에 따라 달라질 수 있습니다.
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(명명된 반환 값 최적화)는 지역 변수 반환 동작에 어떤 영향을 줍니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!