Ссылка на C ++ 11 также вызывает конструктор копирования
Я тестировал некоторые функции C ++ 11 из некоторых. Я наткнулся на ссылки r-значения и конструкторы перемещения.
Я реализовал свой первый конструктор перемещения, вот он:
#include <iostream>
#include <vector>
using namespace std;
class TestClass{
public:
TestClass(int s):
size(s), arr(new int[s]){
}
~TestClass(){
if (arr)
delete arr;
}
// copy constructor
TestClass(const TestClass& other):
size(other.size), arr(new int[other.size]){
std::copy(other.arr, other.arr + other.size, arr);
}
// move constructor
TestClass(TestClass&& other){
arr=other.arr;
size=other.size;
other.arr=nullptr;
other.size=0;
}
private:
int size;
int * arr;
};
int main(){
vector<TestClass> vec;
clock_t start=clock();
for(int i=0;i<500000;i++){
vec.push_back(TestClass(1000));
}
clock_t stop=clock();
cout<<stop-start<<endl;
return 0;
}
Код работает отлично. В любом случае, помещая std :: cout в конструктор копирования, я заметил, что он вызывается! И много раз .. (переместите конструктор 500000 раз, скопируйте конструктор 524287 раз).
Что меня больше всего удивило, так это то, что если я закомментирую конструктор копирования из кода, вся программа станет намного быстрее, и на этот раз конструктор перемещения будет вызываться 1024287 раз.
Любая подсказка?