Переход от
https://www.cnblogs.com/jianhui-Ethan/p/4665573.html
Новые возможности введена в C ++ 11, в дополнении к параллельной модели памяти и связанным с ними объекты, эти высокие красивые богатые, захватывающие и большинство свойств наземного газа необходимо , это «правильные значения привели» к ( RValue Reference). Мотивация присоединиться RValue ссылки , что эффективность: сокращение ненужных копий ресурсов. Рассмотрим следующую программу:
станд :: вектор <строка> v; v.push_back ( "строка");
Первый взгляд на push_back:
push_back (сопзЬ Т & х)
Фактическая загрузка идет ссылку
Push_back построены при использовании конструкции:
недействительная конструкция (Т1 * р, сопз Т2 и значение) { новое (р) Т1 (значение); }
Т1 * итератор для размещения упомянутого, а значение представляет собой значение , установленное в качестве ссылки. Т1 является тип итератора, а также адрес для итератора , который р, что итератора конструкция на самом деле принадлежит позиции, на величину T1 построить тип итератора.
Стоит отметить, что контейнер, в котором элементы хранения управления находятся в куче (свободный магазин с более точным), что сам контейнер может быть в стеке, но это, безусловно, элемент управления в куче ,
Назад в вышеописанном процессе:
Во-первых, «строка» символ * Это направлено область, которая на самом деле называется и push_back строка & является переменной, поэтому первое неявное преобразование, вызывающая строка строка (Const символ *) Этот параметр конструктора, содержащий.
И это на самом деле генерируется переменное временной переменным.
push_back можно увидеть, что он прошел Сенат, так что эта временная переменная передается непосредственно в без того, чтобы быть конструктор копирования.
До сих пор использование неявного преобразования, и это неявный конструктор преобразования вызывается с параметрами (символ *) струны.
После ввода в конструкцию, и построить также передаются по ссылке, поэтому нет вызова конструктора.
Построить но внутренне, когда новый новый, содержащие параметры конфигурации T1, соответствующее временную переменную кучу построено с использованием переменного типа T1
Этот вызов конструктора.
А поскольку итератора является исходный вектор указателей, где Т1 и Т2, таким образом, одного и того же типа (конечно, другой контейнер не обязательно является случай)
Поэтому вызовы на самом деле конструктор копирования
После завершения структуры кучи, де стеками Конструкции, push_back де стек, и из - за этого временным переменный из области видимости и разрушаются
Этот процесс на самом деле испытывали структуру , содержащую параметры, конструктор копирования, деструктор раз
станд :: вектор <строка> v; v.push_back ( "строка");