C++对象赋值和移动时堆内存的使用差异

接上一篇,这里用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.

借助工具,我们可以直观看到两个操作的差异;执行效率上,从源代码上更是一目了然。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值