c++ - 既然我们已经有了 move 语义,那么专门化 std::swap 了吗?

标签 c++ templates c++11 swap move-semantics

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/

相关文章:

c++ - std::ifstream::open不一致失败

c++ - 在同一个类的静态函数中创建一个类的实例是未定义的行为吗

c++ - 专门化模板成员函数 [SFINAE]

c++ - C++中的模板疑惑

c++ - constexpr 函数可以调用返回 void 的函数吗?

algorithm - 如何在 C++ 中将函数作为参数传递给类构造函数

c++ - Microsoft 是否有一个网页保留了在最新 VC++ 中实现的 C++11 功能的最新列表?

c++ - 在设计器中触发的 Firemonkey 自定义控件单击事件

c++ - 对使用带有 istream 参数的构造函数感到困惑

c++ - 在非静态成员函数中使用时,非静态成员的名称是否依赖?