我读过下面的文章,它让我对移动语义有了一个很好的洞察:
但我还是不明白关于移动语义学的以下内容-
向量vt = CreateMyClassVector();
而要执行诸如排序等操作,为什么STL内部不能利用move语义来改善内部操作,比如复制省略或RVO,这不需要移动构造函数?
std::vector< int > vt1(1000000,5);//创建并初始化值为5的100万个条目
std::vector< int > vt2(std:: move ( vt1 ));//将vt1移动到vt2
由于整数是一个基本类型,移动整数元素不会提供任何优势。或者,在移动操作之后,vt2直接指向堆中的vt1内存,vt1设置为null。到底发生了什么?如果是后者,那么甚至第2点认为我们可能不需要为我们的类移动构造函数。
std::vector<MyClass> vt;
for(int i=0; i<10; ++i)
{
vt.push_back(MyClass());
}
MyClass obj;
vt.push_back(std::move(obj));既然向量有连续的内存分配,而obj是在内存中的其他地方定义的--如何移动语义--如何将obj内存移动到向量vt连续内存区域,在这种情况下,移动内存是否与复制内存一样好,那么移动如何通过移动指向堆中不同区域的内存的指针来证明向量连续内存需求的合理性呢?
谢谢你提前解释!根据要求编辑了问题。
发布于 2013-01-30 12:29:22
大多数语义不是移动记忆的一种方式。这都是关于从一个对象实例到另一个对象实例的对象所有权的转换。当你这样做时:
std::string str1("Some string.");
std::string str2(std::move(str1));std::string分配和管理字符缓冲区。因此,每个std::string都拥有一个内存缓冲区,其中包含字符串本身。
调用用于构造str2的移动构造函数将接受str1分配的字符缓冲区,并将其从该对象中删除。因此,str2现在有了str1最初分配的指针,而str1不再有这个指针了。这就是移动语义的意义所在:转移对象拥有的内存的所有权。
如果您的类没有移动构造函数,std::vector将不会调用它。很明显。因此,它不能利用移动构造函数可能带来的任何潜在的优化。但是,这些优化机会只存在于具有值语义且包含必须管理的资源的对象。否则,运动对你没有帮助。
一般规则是使用智能指针和容器对象(如vector、string等)来避免编写移动构造函数。因此,(如果编译器正确地支持生成移动构造函数)资源管理将自动进行。
https://stackoverflow.com/questions/14603669
复制相似问题