Possible Duplicate:
Move semantics == custom swap function obsolete?
这就是 std::swap
在 C++11 中的样子:
template<typename T>
void swap(T& x, T& y)
{
T z = std::move(x);
x = std::move(y);
y = std::move(z);
}
我是否仍然需要为我自己的类型专门化 std::swap
,或者 std::swap
是否尽可能高效,前提是我的类定义当然是 move 构造函数和 move 赋值运算符?
最佳答案
std::swap
的特化现在是可选的,但没有被弃用。理由是性能。
对于原型(prototype)代码,甚至可能对于大量交付代码,std::swap
将非常快。但是,如果您需要从代码中挖掘出每一点点,编写自定义交换仍然可以带来显着的性能优势。
考虑这样一种情况,你的类本质上只有一个拥有指针,而你的 move 构造函数和 move 赋值只需要处理那个指针。计算每个成员的机器负载和存储:
move 构造函数:1 次加载和 2 次存储。
move 分配:2 次加载和 2 次存储。
自定义交换:2 次加载和 2 次存储。
std::swap
是 1 次 move 构造和 2 次 move 分配,或者:5 次加载和 6 次存储。
自定义交换可能仍然比 std::swap
快两到三倍。尽管任何时候你试图通过计算负载和存储来计算某物的速度,但两者都会很快。
注意:在计算 move 分配的成本时,请确保并考虑到您将 move 到 move 的值(在 std::swap
算法中)。这通常抵消了重新分配的成本,尽管是以分支为代价的。
关于c++ - 既然我们已经有了 move 语义,那么专门化 std::swap 了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8617305/