我最近一直在阅读关于移动语义的内容以及它是如何引入C语言的.主要的要点是程序可以通过“窃取”指向临时对象的指针来创建对象,从而提高效率.这比执行临时对象的深层复制以创建新对象更有效.
在C 11(及以后)中,这是通过使用右值参考来实现的.所有临时对象(程序内存中没有已知位置的对象)都被视为右值.具体来说,类构造函数现在可以重载以接受rvalue引用.
所以我很好奇,在C 11之前,这个“昂贵的临时对象复制”问题是如何解决的?
解决方法:
这样做的主要方式是通过std :: swap. std :: swap可以重载/专用于类型,它可以比默认的“通过临时变量交换”更有效地执行,而不是执行浅交换.
通常,数据类型将提供swap()成员函数,该函数可由此重载用于访问数据类型的私有内部. (例如;见std::vector::swap)
例如;要将元素“移动”到向量中,可以使用以下代码:
class MyListOfVectors {
private:
//using `std::vector<int>` as an example of a "movable" type.
std::vector<std::vector<int>> list;
public:
void emplace_back(std::vector<int> &n) {
using std::swap;
list.push_back(std::vector<int>());
swap(list.back(), n);
//(possibly add something to rollback the `push`
// in case swap fails; to provide the strong
// exception guarantee)
}
};
要通过“move”返回元素,可以使用以下代码:
std::vector<int> MyListOfVectors::pop_back() {
using std::swap;
std::vector<int> r;
swap(list.back(), r);
list.pop_back();
return r; //Trust in copy elision to avoid any actual copies.
}
我没有这方面的参考,但我相信允许/鼓励标准算法为此目的使用std :: swap.
此外,如果你觉得你想用C 11方式做事,你也可以使用boost::move,它提供了C 03中C 11移动语义的模拟(虽然它在技术上违反了严格的别名,因此具有未定义的行为).
标签:c,c03 来源: https://codeday.me/bug/20190828/1754842.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。