NRV (именованное возвращаемое значение) конструктор копирования

Недавно я читал «внутри объектной модели c ++» и во время чтения главы 5 у меня возник следующий вопрос:

Будет ли компилятор обрабатывать NRVO, даже если у класса есть конструктор копирования?

2

Решение

Ответ: «Нет, это не помешает».

n3290 (черновик C ++ 11), книга 12, глава 8, стих 31 (p284):

При соблюдении определенных критериев реализация может опустить конструкцию копирования / перемещения класса.
объект, даже если конструктор копирования / перемещения и / или деструктор для объекта имеют побочные эффекты.

3

Другие решения

RVO (или NRVO) — это оптимизация того компилятора может быть использовать для исключения копий, т.е. предотвратить создание избыточных копий. Ваша пользовательская реализация конструктора копирования не может предотвратить применение этой оптимизации.

2

RVO более или менее создает объект в другой области видимости и использует этот объект вместо локального при чтении или записи переменных. Это приводит к тому, что создается только один объект и вообще не вызывается копия ctor, что делает его объявленным несущественным.

0

Я думаю, что ваш вопрос «если тривиальный конструктор копирования будет препятствовать nrvo»,
Мой ответ — нет.
Я использую случай в книге «внутри объектной модели c ++», пусть он печатает адрес члена в функции foo и в основной функции, результат показывает, что они одинаковы в режиме выпуска и отличаются в режиме отладки без оптимизм во вс 2010.
Это означает, что NRVO не заботится о том, есть ли у вас нетривиальный конструктор копирования или тривиальный.

0
По вопросам рекламы [email protected]