Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

C++11 лажа?

20.08.16 15:09
Re: C++11 лажа?
 
dymanoid постоялец
dymanoid
в ответ AlexNek 20.08.16 12:53
Я хоть уже всё и забыл, но что то не врублюсь в проблему. Всё работает как и должно при чём тут оптимизация?

Вы правы, вы не поняли проблему.

Попробую разжевать.

Вызываем функцию ddd(). Эта функция создаёт объект типа DDD, поместив его в стек этой функции в качестве неименованного временного значения (unnamed temporary). Функция должна вернуть объект типа DDD по значению (by-value), соответственно, объект должен быть скопирован из неименованного временного значения в возвращаемое значение. Так бы поступил какой-нибудь древний компилятор. Современный компилятор (c++11 с семантикой перемещения) видит, что это самое неименованное временное значение нигде больше в функции ddd() не используется, поэтому этот компилятор может сгенерировать код перемещения объекта из временного значения во возвращаемое. Это и есть оптимизация (возможный её вариант). Таким образом возвращаются контейнеры стандартной библиотеки, например. Т.о. автор вопроса ожидал в этом случае увидеть вызов либо конструктора копирования (без оптимизации), либо конструктора перемещения (с оптимизацией по перемещению).


Но как я уже приводил выше, стандарт разрешает полностью исключать вызовы конструкторов копирования или перемещения в рамках RVO. В этом случае объект создаётся напрямую в стеке вызывающей функции, без создания неименованного временного значения, без копирования и перемещения.


Можете хотя бы на Википедии коротко про это почитать.

 

Перейти на