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

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

#include 
#include 

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;
}

你可能感兴趣的:(c++11新特性,c++,java,开发语言)