Что происходит:
x
вставлен через push_back
. Возникает одна копия: вновь созданный элемент инициализируется аргументом. my_int
берется как ноль, потому что конструктор по умолчанию x
s инициализировал его так. push_back
'd; Вектор должен перераспределить память, так как была достигнута внутренняя емкость . Поскольку конструктор перемещения неявно определен для Myint
1, выбран конструктор копирования; Первый элемент копируется во вновь выделенную память (его my_int
все еще ноль ... поэтому конструктор копирования снова показывает my_int
как 0
), а затем x
копируется для инициализации второго элемента (как в случае с первый в шаге 1). На этот раз x
задано значение my_int
, и это говорит нам вывод конструктора копирования. Таким образом, общий объем вызовов - три. Это может варьироваться от одной реализации к другой, поскольку первоначальная емкость может отличаться. Тем не менее, два вызова являются минимальными.
Вы можете уменьшить количество копий за счет резервирования большего объема памяти, то есть увеличить емкость векторов, чтобы перераспределение стало ненужным:
myints.reserve(2); // Now two elements can be inserted without reallocation.
Кроме того, вы можете высвободить копии при вставке следующим образом:
myints.emplace_back(0);
Этот «emplaces» новый элемент - emplace_back
является вариационным шаблоном и поэтому может принимать произвольное количество аргументов, которое оно затем пересылает - без копий или движений - в конструктор элементов.
1 Поскольку существует конструктор, созданный пользователем.
Самый надежный способ публикации подключаемого модуля (или функции) для других пользователей - создание сайта обновления. Затем вы можете направлять пользователей на этот сайт, чтобы они могли установить ваши плагины / функции через Установить новый программный интерфейс . Он также предоставляет простой способ публикации обновлений ваших плагинов.