/Zc:nrvo (Управление необязательным NRVO)

Параметр /Zc:nrvo компилятора управляет необязательной оптимизацией возвращаемых значений (NRVO) standard C++ или поведением перемещения.

Синтаксис

/Zc:nrvo[-]

Замечания

В Visual Studio 2022 версии 17.4 и более поздних версиях можно явно включить необязательное поведение копирования или перемещения с помощью параметра компилятора /Zc:nrvo . Этот параметр отключен по умолчанию, но устанавливается автоматически при компиляции с помощью /O2 параметра, /permissive- параметра или /std:c++20 более поздней версии. В разделе /Zc:nrvoкопирования и перемещения выполняется все возможное. Необязательная копия или перемещение также может быть явно отключена с помощью /Zc:nrvo- параметра. Эти параметры компилятора управляют только необязательным копированием или перемещением элизиона. Обязательное копирование или перемещение элизиона (указанное стандартом C++) не может быть отключено.

Обязательное копирование и перемещение elision

Стандарт C++ требует копирования или перемещения, когда возвращаемое значение инициализировано в рамках инструкции return. Например, при возврате функции, возвращаемой ExampleType с помощью return ExampleType();. Компилятор MSVC всегда выполняет копирование и перемещение элизиона для return инструкций, когда это необходимо, даже в разделе /Zc:nrvo-.

Необязательное копирование и перемещение elision

return Если инструкция содержит выражение немитивного типа, его выполнение копирует результат выражения в возвращаемый слот вызывающей функции. Компилятор вызывает конструктор копирования или перемещения возвращаемого типа. Затем, когда функция завершается, вызываются деструкторы для локальных переменных функции, которые включают любые переменные, именованные в выражении.

Стандарт C++ позволяет (но не требуется) компилятору при необходимости создавать возвращаемый объект непосредственно в слоте возврата вызывающей функции. Эта конструкция пропускает (или скользит) конструктор копирования или перемещения, выполняемый в рамках инструкции return . В отличие от большинства других оптимизаций, это преобразование может иметь наблюдаемое влияние на выходные данные программы. Например, конструктор копирования или перемещения и связанный деструктор называются меньше времени. Стандарт по-прежнему требует, чтобы именованной возвращаемой переменной был определенный конструктор копирования или перемещения, даже если компилятор скользит конструктор во всех случаях.

В версиях до Visual Studio 2022 версии 17.4 при отключении оптимизации (например, в /Od функциях или в функциях #pragma optimize("", off)) компилятор выполняет только обязательную копию и удаление перемещения. В разделе /O2старых компиляторов выполняется необязательное копирование или перемещение элизиона при возвращении именованной переменной в оптимизированной функции при выполнении всех этих условий: она не имеет циклов или обработки исключений, она не возвращает несколько символов с перекрывающимися временем существования, конструктор копирования или перемещения типа не имеет аргументов по умолчанию.

Visual Studio 2022 версии 17.4 увеличивает количество мест, в которых компилятор выполняет необязательную копию или перемещение elisions в /Zc:nrvoпапку , включенную явным образом или автоматически с помощью /O2параметров , /permissive-или /std:c++20 более поздних версий. В разделе /Zc:nrvoкомпилятор выполняет необязательное копирование или перемещение элизиона при возвращении именованной переменной для любой функции, когда: у него нет циклов или обработки исключений (как и раньше), она возвращает переменную из цикла; она имеет обработку исключений, а конструктор копирования или перемещения возвращаемого типа имеет аргументы по умолчанию. Необязательные операции копирования или перемещения никогда не выполняются, когда /Zc:nrvo- применяется, или когда функция возвращает несколько символов с перекрывающимися временем существования или для создания именованной переменной.

Дополнительные сведения и примеры обязательных и необязательных фрагментов копирования см. в разделе "Улучшение копирования и перемещения Элизиона/Zc:nrvo" в блоге команды C++.

Установка параметра компилятора в Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.

  3. В дополнительных параметрах добавьте /Zc:nrvo или /Zc:nrvo-. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.

См. также

/Zc (Соответствие)
/O2
/permissive-
/std (определение стандартной версии языка)