【c++】移动语义

1.移动语义基本概念

通过移动语义,我们可以利用右值引用,将一个对象的资源“移动”到另一个对象中,避免不必要的内存拷贝和分配。
【右值引用】用于表示“可被移动”或“可被窃取”的对象。

int&& x = 1;

相对应的,左值是指在内存中有确定存储地址的表达式

2.资源所有权问题

当一个对象被移动到另一个对象时,它的资源所有权被转移给了新对象,原对象就不能再使用。

3.基本实现形式

移动构造函数和移动赋值运算符

3.1 移动构造函数

一个不完整的类内函数实现如下:

class MyData {
		......
    // 移动构造函数
    MyData(MyData&& other) {
        std::cout << "MyData Move Constructor!" << std::endl;
        mDataSize = other.mDataSize;
        mData = other.mData;
        other.mDataSize = 0;
        other.mData = nullptr;
    }
    int* mData;
    int mDataSize;
 }
int main() {
    // 创建一个MyData对象
    MyData data(10);
    // 移动构造函数
    MyData data_move = std::move(data);
    return 0;
}

移动构造函数一定要将原先的数据置零否则会出现程序崩溃等问题

3.2 移动赋值运算符

class StringArray {
	.....
    StringArray& operator=(StringArray&& other) noexcept {
        if (this != &other) {
            // release the resources of the current object
            delete[] m_data;

            // move the resources of the other object to the current object
            m_size = other.m_size;
            m_data = other.m_data;

            // reset the other object
            other.m_size = 0;
            other.m_data = nullptr;
        }
        return *this;
    }
 }
int main() {
	......
    StringArray new_strs;
    new_strs = std::move(strs);  // 使用移动赋值运算符
 // 此时strs中的数据已经被移动到了new_strs中
    return 0;
}

区别在于:

移动构造是在创建新对象时,将已经存在的对象的资源“移动”到新对象上;
移动赋值是在已有对象的基础上,将另一个已有对象的资源“移动”到该对象上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值