考虑一个自定义类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();
}
swap(x1, x2)
只需交换2个整数。 std::swap(x1, x2)
拨打1x MC和2x MAO 。std::swap(x1, x2)
将调用3x MC和2x UAO 。(使用gcc / libstdc ++测试)。
看起来,自定义swap
非常有价值,因为它避免了许多函数调用。但是,当我查看此程序的反汇编输出:https://godbolt.org/g/RMfZgL时,MC,MAO,UAO,swap
和std::swap
的所有功能都直接内联到{{1} } (带main
标志的gcc / clang)。此外,在程序中没有创建-O2
类型的对象,它只适用于机器代码级别的整数。
因此,在我看来,没有理由为类X
这样的类提供自定义swap
函数。
问题:
X
内优化MC和MAO / UAO的调用,这是一种好习惯吗?或者,我是否应该为所有自定义类定义自定义std::swap
?swap
哪些类真正有用?