何时在C ++中提供自定义交换功能?

时间:2017-08-11 16:42:37

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

考虑一个自定义类X,它包含一些资源(为简单起见,这里用整数成员变量表示),包含移动构造函数(MC),移动赋值运算符(MAO)和自定义交换函数:

class X {
  int i_;
public:
  X(int i) : i_(i) { }
  X(X&& rhs) = default; // move constructor 
  X& operator=(X&& rhs) = default; // move assignment operator 
  // X& operator=(X rhs) { std::swap(i_, rhs.i_); return *this; } // unifying assign. op.
  friend void swap(X& lhs, X& rhs) { std::swap(lhs.i_, rhs.i_); }
  int i() const { return i_; }
};

在以下基准代码中:

int main() {
  int i1, i2;
  std::cin >> i1 >> i2;

  X x1(i1), x2(i2);
  std::cout << x1.i() << x2.i();

  swap(x1, x2);
  std::cout << x1.i() << x2.i();

  std::swap(x1, x2);
  std::cout << x1.i() << x2.i();
}
  1. swap(x1, x2)只需交换2个整数
  2. std::swap(x1, x2) 拨打1x MC和2x MAO
  3. 如果MAO被统一赋值运算符(UAO)取代,std::swap(x1, x2) 将调用3x MC和2x UAO
  4. (使用gcc / libstdc ++测试)。

    看起来,自定义swap非常有价值,因为它避免了许多函数调用。但是,当我查看此程序的反汇编输出:https://godbolt.org/g/RMfZgL时,MC,MAO,UAO,swapstd::swap的所有功能都直接内联到{{1} } (带main标志的gcc / clang)。此外,在程序中没有创建-O2类型的对象,它只适用于机器代码级别的整数。

    因此,在我看来,没有理由为类X这样的类提供自定义swap函数。

    问题:

    1. 假设编译器会在X内优化MC和MAO / UAO的调用,这是一种好习惯吗?或者,我是否应该为所有自定义类定义自定义std::swap
    2. 自定义swap哪些类真正有用?

0 个答案:

没有答案