Похоже, что vector делает копии существующих объектов при добавлении новых
Когда вы добавляете элемент, например, с v.push_back(AClass(i));
, то, что делается, является временным AClass
объект создан и передан push_back
.push_back
должен затем скопировать этот объект в контейнер.
Другая причина, по которой вы видите сделанные копии, заключается в том, что std::vector
хранит свои элементы непрерывно в массиве.Если в базовом массиве не осталось места и вы пытаетесь добавить еще один элемент в конец, std::vector
должен создать новый массив, скопировать элементы из старого массива в новый, а затем вставить новый элемент вконец.Если вы не хотите, чтобы это происходило, вы можете вызвать std::vector::reserve
, чтобы зарезервировать достаточно места в std::vector
, прежде чем начинать вставлять элементы, или вы можете использовать другой контейнер последовательности, такой как std::deque
, который не хранит егоэлементы смежно.
кажется, что происходит много ненужного выделения / удаления
В программе на C ++ объекты часто создаются и уничтожаются.Обратите внимание, что в вашей программе AClass
очень дешево копировать: его размер, вероятно, составляет четыре или восемь байтов, достаточно большой, чтобы вместить его элемент данных int
.
Если у вас есть тип, который копируется дорого (например, возможно, у вас есть большая древовидная структура данных с тысячами узлов), тогда да, копирование может быть слишком дорогим.В этом случае вы можете хранить умные указатели для динамически размещаемых объектов в std::vector
(например, std::vector<shared_ptr<AClass> >
).Если ваш компилятор поддерживает ссылки на rvalue и имеет реализацию стандартной библиотеки с поддержкой перемещений, вы можете сделать перемещаемый тип дорогостоящим для копирования, реализовав конструктор перемещения и оператор присваивания перемещения и используя emplace_back
вместо push_back
.
почему вторая версия работает, когда я не предоставил конструктор копирования?
Если вы не объявляете конструктор копирования, компилятор предоставляет вам конструктор копирования по умолчанию.