다음을 통해 공유


/Zc:nrvo (컨트롤 선택적 NRVO)

/Zc:nrvo 컴파일러 옵션은 표준 C++ 선택적 NRVO(명명된 반환 값 최적화) 복사 또는 이동 엘리전 동작을 제어합니다.

구문

/Zc:nrvo[-]

설명

Visual Studio 2022 버전 17.4 이상에서는 컴파일러 옵션을 사용하여 /Zc:nrvo 선택적 복사 또는 이동 엘리전 동작을 명시적으로 사용하도록 설정할 수 있습니다. 이 옵션은 기본적으로 해제되어 있지만 옵션, /permissive- 옵션 이상을 /std:c++20 사용하여 /O2 컴파일할 때 자동으로 설정됩니다. 아래에서 /Zc:nrvo복사 및 이동 엘리전은 가능한 한 수행됩니다. 선택적 복사 또는 이동 엘리전은 옵션을 사용하여 /Zc:nrvo- 명시적으로 사용하지 않도록 설정할 수도 있습니다. 이러한 컴파일러 옵션은 선택적 복사 또는 이동 엘리션만 제어합니다. 필수 복사 또는 이동 엘리전(C++ 표준으로 지정됨)을 사용하지 않도록 설정할 수 없습니다.

필수 복사 및 이동 엘리전

반환된 값이 반환 문의 일부로 초기화될 때 C++ 표준에는 복사 또는 이동 엘리전이 필요합니다. 예를 들어 함수가 .를 사용하여 return ExampleType();반환된 값을 반환하는 ExampleType 경우 필요합니다. MSVC 컴파일러는 필요할 때에도 /Zc:nrvo-항상 문에 대한 return 복사 및 이동 엘리션을 수행합니다.

선택적 복사 및 이동 엘리전

return 문이 기본이 아닌 형식의 식을 포함하는 경우 해당 실행은 식 결과를 호출 함수의 반환 슬롯에 복사합니다. 컴파일러는 반환된 형식의 복사 또는 이동 생성자를 호출합니다. 그런 다음 함수가 종료되면 식에 명명된 모든 변수를 포함하는 함수-지역 변수에 대한 소멸자가 호출됩니다.

C++ 표준을 사용하면 컴파일러가 필요에 따라 반환된 개체를 호출 함수의 반환 슬롯에 직접 생성할 수 있습니다(필요하지는 않음). 이 생성은 문의 일부로 return 실행된 복사 또는 이동 생성자를 건너뜁니다(또는 elides). 대부분의 다른 최적화와 달리 이 변환은 프로그램의 출력에 관찰 가능한 영향을 미칠 수 있습니다. 즉, 복사 또는 이동 생성자 및 관련 소멸자를 한 번 더 적게 호출합니다. 이 표준에서는 컴파일러가 모든 경우에 생성자를 제외하더라도 명명된 반환된 변수에 정의된 복사 또는 이동 생성자가 있어야 합니다.

Visual Studio 2022 버전 17.4 이전 버전에서 최적화가 비활성화된 경우(예: /Od 아래 또는 표시된 #pragma optimize("", off)함수에서) 컴파일러는 필수 복사 및 이동 엘리션만 수행합니다. 아래에서 /O2이전 컴파일러는 이러한 모든 조건이 충족될 때 최적화된 함수에서 명명된 변수를 반환할 때 선택적 복사 또는 이동 엘리션을 수행합니다. 루프 또는 예외 처리가 없고, 수명이 겹치는 여러 기호를 반환하지 않으며, 형식의 복사 또는 이동 생성자에는 기본 인수가 없습니다.

Visual Studio 2022 버전 17.4는 컴파일러가 명시적으로 사용하든, 또는 그 이상의 옵션을 사용하여 /O2/permissive-자동으로 활성화되었는지 여부에 관계없이 선택적 복사 또는 /std:c++20 이동 엘리션을 /Zc:nrvo수행하는 위치의 수를 증가합니다. 아래 /Zc:nrvo의 컴파일러는 루프 또는 예외 처리(이전과 같이)가 없고, 루프에서 변수를 반환하고, 예외 처리가 있으며, 반환된 형식의 복사 또는 이동 생성자에 기본 인수가 있는 경우 모든 함수에 대해 명명된 변수를 반환할 때 선택적 복사 또는 이동 엘리션을 수행합니다. 선택적 복사 또는 이동 엘리션은 적용되거나 함수가 수명이 겹치는 여러 기호를 반환하거나 명명된 변수를 throw할 때 /Zc:nrvo- 수행되지 않습니다.

아래의 필수 및 선택적 복사본 엘리션/Zc:nrvo에 대한 자세한 내용과 예제는 C++ 팀 블로그에서 복사 및 이동 엘리션 개선을 참조하세요.

Visual Studio에서 이 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.

  3. 추가 옵션에서 /Zc:nrvo 또는 /Zc:nrvo-을(를) 추가합니다. 확인을 선택하거나 적용을 선택하여 변경 내용을 저장합니다.

참고 항목

/Zc(규칙)
/O2
/permissive-
/std(언어 표준 버전 지정)