接上一篇,这里用Valgrind套件中的massif来观察程序运行中堆内存的变化。
测试代码:
#include <iostream>
using namespace std;
class myVector
{
private:
double *ele;
int size;
public:
myVector();
myVector(int sz);
~myVector();
double& operator[](int i)
{
if (i < 0 || i >= size)
{
throw "Index out of range";
}
return ele[i];
}
double operator[](int i) const
{
if (i < 0 || i >= size)
{
throw "Index out of range";
}
return ele[i];
}
myVector& operator=(const myVector& v)
{
if (this == &v)
{
return *this;
}
if (size != v.size)
{
delete[] ele;
ele = new double[v.size];
size = v.size;
}
for (int i = 0; i < size; i++)
{
ele[i] = v.ele[i];
}
return *this;
}
myVector& operator=(myVector&& v)
{
size = v.size;
delete[] ele;
ele = v.ele;
v.size = 0;
v.ele = nullptr;
return *this;
}
int getSize() const
{
return size;
}
};
myVector::myVector():size(1)
{
ele = new double;
ele[0] = 0;
}
myVector::myVector(int sz) : size(sz)
{
ele = new double[size];
for (int i = 0; i < size; i++)
{
ele[i] = 0;
}
}
myVector::~myVector()
{
delete[] ele;
}
int main()
{
myVector v(2048);
v[0] = 1.0;
v[1] = 2.0;
v[2] = 3.0;
v[3] = 4.0;
v[4] = 5.0;
for (int i = 0; i < 5; i++)
{
cout << v[i] << " ";
}
cout << endl;
myVector v2(1024);
v2 = v; //line 105
//v2 = std::move(v); //line 106
cout << v2.getSize() << endl;
return 0;
}
第一次执行,注释掉 line106,执行前一行的赋值,查看记录的内存跟踪图如下。
可以看到,程序使用堆内存的最大量为105K,选中那一行表明当时执行的是普通赋值操作,给v2新分配了16K内存。
第二次执行,注释掉line 105,执行line 106的移动操作,内存跟踪图如下。
可以看到,最大堆内存使用量为97KB,因为移动操作不再重新给v2分配内存,而是直接将v占用的内存移给v2.
借助工具,我们可以直观看到两个操作的差异;执行效率上,从源代码上更是一目了然。