[英]How move constructor works in C++?
我已经阅读了很多关于移动构造函数的文章(甚至在堆栈上),但是我没有找到关于它是如何工作的确切解释(如果转移指针指向临时对象并且如果此临时变量及其地址在遇到时将被销毁则保存“)”)。
这是一个简单的例子
#include <iostream>
#include <vector>
using namespace std;
class boVector {
private:
int size;
public:
boVector() {};
boVector(const boVector& rhs) { cout << "copy Ctor." << endl; }
boVector(boVector&& rhs) { cout << "move Ctor." << endl; }
};
void foo(boVector v) {}
boVector createBoVector() { return boVector(); }
int main()
{
//copy
boVector reausable = createBoVector();
foo(reausable);
//move
foo(std::move(createBoVector()));
return 0;
}
所有人都说移动Ctor是浅拷贝副本或只是一个指针赋值。 但是,如何使用指向临时对象的指针启动我的对象(当此对象将被破坏时,我的对象将指向一个未知地址,从我的角度来看这是无效的)。
用指针地址启动变量是不对的,在满足“)”后它将不再存在。
请问是否可以有人解释我如何在内存中查找此临时变量以及如何将临时对象的地址分配给我当前的一个并且此操作是有效的。
“移动构造函数”并不神奇 - 它是一个采用右值引用的构造函数。
Rvalue引用绑定到临时对象,并具有即将到期的某些东西的“含义”,并且稍后将无法在程序中访问:这使开发人员能够根据指针交换或类似方式实现资源保留类的移动快速操作。
你的boVector
类实际上不能从移动语义中获得任何好处,因为它只存储一个int
并且不包含任何资源。 移动int
与复制int
一样快。
在里面
foo(std::move(createBoVector()));
表达式, std::move
是多余的,因为createBoVector()
已经是一个右值 。
考虑:
foo(createBoVector());
这将调用boVector(boVector&&)
因为它比boVector(const boVector&)
更好。
由createBoVector()
创建的实例将在表达式的整个持续时间内生效 - 这意味着rvalue引用将在boVector(boVector&&)
的持续时间内指向有效对象。
所有人都说移动Ctor是浅拷贝副本或只是一个指针赋值。
并非所有人都这么说,因为事实并非如此。 移动构造函数是您定义它的原因。 在您的示例中,您的移动ctor完全做了其他事情。 移动ctor - 与复制ctor相反 - 是你知道另一个对象即将被销毁,所以你可以蚕食或移动它的资源。
移动构造函数可以制作“浅拷贝”,尽管该术语是口语而不是在C ++中定义明确。 “只是一个指针分配” - 也许,有时可能。
但是,如何使用指向临时对象的指针启动我的对象(当此对象将被破坏时,我的对象将指向一个未知地址,从我的角度来看这是无效的)。
您(通常)不会使用类型为T*
的指针初始化类型为T
的对象。 您可以指定my_t = *my_t_ptr
,或者如果您知道可以“蚕食” my_t_ptr
指向的T
,因为它很快就会被删除,那么您可以指定my_t = std::move(*my_t_ptr)
。
你能给我一个更相关的例子[移动构造函数和复制构造函数之间有意义的区别] ......?
“经典”示例是通过在堆上分配一些空间来构造T
当你从另一个T
复制构造一个T
时,你别无选择,只能分配第二段内存; 当你移动构造一个T
,你可以:1。 将指针从现有T
复制到正在构建的T
2.将现有T
的成员指针设置为nullptr
。 在这种情况下,您只使用一个T
的堆栈空间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.