Почему перераспределяется векторная копия вместо перемещения элементов? [Дубликат]
Possible Duplicate:
How to enforce move semantics when a vector grows?
insert
, push_back
а такжеemplace
(_back
) может вызвать перераспределениеstd::vector
, Я был сбит с толку, увидев, что следующий кодcopies элементы вместоmoving их при перераспределении контейнера.
<code>#include <iostream> #include <vector> struct foo { int value; explicit foo(int value) : value(value) { std::cout << "foo(" << value << ")\n"; } foo(foo const& other) noexcept : value(other.value) { std::cout << "foo(foo(" << value << "))\n"; } foo(foo&& other) noexcept : value(std::move(other.value)) { other.value = -1; std::cout << "foo(move(foo(" << value << "))\n"; } ~foo() { if (value != -1) std::cout << "~foo(" << value << ")\n"; } }; int main() { std::vector<foo> foos; foos.emplace_back(1); foos.emplace_back(2); } </code>
На моей конкретной машине, использующей мой определенный компилятор (GCC 4.7), это печатает следующее:
<code>foo(1) foo(2) foo(foo(1)) ~foo(1) ~foo(1) ~foo(2) </code>
Однако при удалении конструктора копирования (foo(foo const&) = delete;
), генерируется следующий (ожидаемый) результат:
<code>foo(1) foo(2) foo(move(foo(1)) ~foo(1) ~foo(2) </code>
Это почему? Будет ли перемещение в целом более эффективным или, по крайней мере, не намного менее эффективным, чем копирование?
Следует отметить, чтоGCC 4.5.1 делает ожидаемую вещь & # x2013; & # xA0; это регрессия в GCC 4.7 или это хитроумная оптимизация, потому что компилятор видит, что мой объект копируется дешево (но как ?!)?
Также обратите внимание, что я убедился, что этоis вызвано перераспределением, путем экспериментальногоfoos.reserve(2);
перед вставками; это не вызывает ни копирования, ни перемещения.