C ++ 11: перемещение Семантика и совершенное экспедиторская

Переход от

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 ( "строка");

  

рекомендация

отwww.cnblogs.com/lxy-xf/p/11539946.html