NRV (именованное возвращаемое значение) конструктор копирования
Недавно я читал "внутри объектной модели C++" и во время чтения главы 5 у меня возник следующий вопрос:
Будет ли компилятор обрабатывать NRVO, даже если у класса есть конструктор копирования?
4 ответа
Ответ: "Нет, это не помешает".
n3290 (черновик C++11), книга 12, глава 8, стих 31 (p284):
При соблюдении определенных критериев реализация может опустить конструкцию копирования / перемещения объекта класса, даже если конструктор копирования / перемещения и / или деструктор для объекта имеют побочные эффекты.
RVO (или NRVO) - это оптимизация, которую компилятор может использовать для исключения копий, то есть предотвращения создания избыточных копий. Ваша пользовательская реализация конструктора копирования не может предотвратить применение этой оптимизации.
RVO более или менее создает объект в другой области видимости и использует этот объект вместо локального при чтении или записи переменных. Это приводит к тому, что создается только один объект и не вызывается копия ctor вообще, что делает вас объявленным неуместным.
Я думаю, что ваш вопрос "если конструктор тривиальных копий будет препятствовать nrvo", мой ответ - нет. Я использую случай в книге "внутри объектной модели C++", пусть он печатает адрес члена в функции foo и в основной функции, результат показывает, что они одинаковы в режиме выпуска и отличаются в режиме отладки без оптимизм во вс 2010. Это означает, что NRVO не заботится о том, есть ли у вас нетривиальный конструктор копирования или тривиальный.