移动构造函数使用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;
}