在 C++11 之前移动语义是如何解决的?
How were move semantics addressed before C++11?
我最近一直在阅读移动语义以及它是如何被引入到 C++11 中的。主要要点是,通过 'stealing' 指向临时对象的指针创建对象,程序可以变得更有效率。这比深拷贝临时对象来创建新对象要高效得多。
在 C++11(及更高版本)中,这是通过使用右值引用实现的。所有临时对象(在程序内存中没有已知位置的对象)都被视为右值。具体来说,class 构造函数现在可以重载以接受右值引用。
所以我很好奇,'expensive temporary object copy' 这个问题在 C++11 之前是如何解决的?
完成此操作的主要方式是通过 std::swap
。 std::swap
可以是 overloaded/specialized 类型,它可以比默认 "swap via a temporary variable" 更有效地执行,而不是执行浅交换。
通常数据类型会提供一个 swap()
成员函数,此重载可以使用它来访问数据类型的私有内部结构。 (例如;参见 std::vector::swap)
例如;把"move"一个元素变成vector
,可以用下面的代码:
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"到return一个元素,可以使用下面的代码:
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.
}
我没有这方面的参考,但我相信标准算法 allowed/encouraged 使用 std::swap
来达到这个目的。
另外,如果你觉得你想用 C++11 的方式做事,你也可以使用 boost::move,它提供了 C++ 中 C++11 移动语义的模拟03(尽管它在技术上违反了严格的别名,因此具有未定义的行为)。
我最近一直在阅读移动语义以及它是如何被引入到 C++11 中的。主要要点是,通过 'stealing' 指向临时对象的指针创建对象,程序可以变得更有效率。这比深拷贝临时对象来创建新对象要高效得多。
在 C++11(及更高版本)中,这是通过使用右值引用实现的。所有临时对象(在程序内存中没有已知位置的对象)都被视为右值。具体来说,class 构造函数现在可以重载以接受右值引用。
所以我很好奇,'expensive temporary object copy' 这个问题在 C++11 之前是如何解决的?
完成此操作的主要方式是通过 std::swap
。 std::swap
可以是 overloaded/specialized 类型,它可以比默认 "swap via a temporary variable" 更有效地执行,而不是执行浅交换。
通常数据类型会提供一个 swap()
成员函数,此重载可以使用它来访问数据类型的私有内部结构。 (例如;参见 std::vector::swap)
例如;把"move"一个元素变成vector
,可以用下面的代码:
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"到return一个元素,可以使用下面的代码:
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.
}
我没有这方面的参考,但我相信标准算法 allowed/encouraged 使用 std::swap
来达到这个目的。
另外,如果你觉得你想用 C++11 的方式做事,你也可以使用 boost::move,它提供了 C++ 中 C++11 移动语义的模拟03(尽管它在技术上违反了严格的别名,因此具有未定义的行为)。