Что происходит при перемещении экземпляров класса в вектор (С++)

Уважаемые Гуру, объясните, какие процессы происходят при исполнении этого кода. Почему так много конструкторов вызывается? Т.е. при добавлении элемента в хвост каждый раз происходит копирование каждого элемента. А если тысячи их?

#include <iostream>
#include <vector>

using namespace std;

class Test
{
    int var;
public:
    explicit Test(int arg) : var{arg}
    { cout << "explicit Test(int arg) var=" << var << endl; }

    Test(Test &arg) : var{arg.var}
    { cout << "Test(Test &arg) var=" << var << endl; }

    Test(Test &&arg)
    { 
      swap(var, arg.var);
      cout << "Test(Test &&arg) var=" << var << endl; 
    }

    virtual ~Test()
    { cout << "virtual ~Test() var=" << var << endl; }

    void test_proc() noexcept
    { cout << "test_proc() var=" << var << endl; }
};


int main()
{
    vector<Test> vt;

    vt.emplace_back(Test(1));
    vt.emplace_back(Test(2));
    vt.emplace_back(Test(3));
}

Вывод:

explicit Test(int arg) var=1
Test(Test &&arg) var=1
virtual ~Test() var=0
explicit Test(int arg) var=2
Test(Test &&arg) var=2
Test(Test &&arg) var=1
virtual ~Test() var=0
virtual ~Test() var=0
explicit Test(int arg) var=3
Test(Test &&arg) var=3
Test(Test &&arg) var=1
Test(Test &&arg) var=2
virtual ~Test() var=0
virtual ~Test() var=0
virtual ~Test() var=0
virtual ~Test() var=1
virtual ~Test() var=2
virtual ~Test() var=3

Ответы (1 шт):

Автор решения: Harry

Всем нужно пользоваться правильно...

vector<Test> vt;
vt.reserve(4);

vt.emplace_back(1);
vt.emplace_back(2);
vt.emplace_back(3);

и вы получаете

explicit Test(int arg) var=1
explicit Test(int arg) var=2
explicit Test(int arg) var=3
virtual ~Test() var=1
virtual ~Test() var=2
virtual ~Test() var=3

Вам все еще пояснять, почему ваш код работает так, как работает?...

→ Ссылка