【11】c++11新特性 —>move移动语义(2)

文章介绍了C++中移动构造函数和std::move()的作用,通过资源所有权转移提升性能,避免无谓的拷贝,通过示例展示了如何在`main()`函数中利用移动构造函数提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移动构造函数使用std::move(),函数是为了实现资源的所有权转移,提高性能和避免不必要的资源拷贝。
在c++11标准中,引入右值引用和移动语义.移动构造函数允许对象的资源(比如堆内存、文件句柄等)在被移动时进行转移,而非传统的拷贝,这种机制可以大幅度提高性能,特别时对于大型对象来说。
当使用移动构造函数时,通常需要使用std::move()函数将左值转换为右值,以便编译器识别出应该调用移动构造函数而非拷贝构造函数.通过使用std::move(),程序员明确知道自己正在进行资源所有权转移,令代码更加清晰和安全。

#include <iostream>
#include <chrono>

class MyData {
private:
    int* data;  // 模拟需要移动的资源,比如堆上分配的内存
public:
    // 构造函数
    MyData(int value) {
        data = new int(value);
    }

    // 移动构造函数
    MyData(MyData&& other) noexcept {
        data = other.data;  // "窃取"资源
        other.data = nullptr;  // 置空原对象的资源指针
    }

    // 拷贝构造函数
    MyData(const MyData& other)
    {
        data = new int(*other.data);  // 执行深拷贝,而非简单的指针复制
    }

    // 析构函数
    ~MyData() {
        delete data;  // 释放资源
    }

    // 打印数据
    void printData() {
        std::cout << "Data: " << *data << std::endl;
    }
};

int main()
{
    MyData a(42);
   
    auto start = std::chrono::high_resolution_clock::now();  // 开始计时
     MyData b = std::move(a);      // 使用移动构造函数,运行时间0.0002ms
    //MyData b = a;                // 使用移动构造函数,运行时间0.0012ms
    auto end = std::chrono::high_resolution_clock::now();  // 结束计时
    std::chrono::duration<double, std::milli> duration = end - start;  // 计算耗时,以毫秒为单位
    std::cout << "Time taken: " << duration.count() << " ms" << std::endl;  // 输出运行时间

    b.printData();  // 这里会输出42,因为a的资源被移动到了b,a为空了。

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<( ̄︶ ̄)Okay.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值