/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
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.
В дополнительных параметрах добавьте
/Zc:nrvo
или/Zc:nrvo-
. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.
См. также
/Zc
(Соответствие)
/O2
/permissive-
/std
(определение стандартной версии языка)