C++ 小结之swap()与move()函数
swap()函数
swap()函数用于交换两个变量的值,这两个变量可以是c++内嵌的类型,也可以是用户自定义的类型。如果是基本的数据类型,基本上就是赋值操作,其逻辑代码如下
void swap( T & a, T & b )
{
T temp = a;
a = b;
b = temp;
}
但是若出现的类型存在动态内存的封装则需要注意
对于动态变量,其变量交换是浅层的,不会出现额外的动态内存分配。
例如
class My_class
{
private:
int * object;
int theSize;
public:
...
};
My_class my_Object_1{ ... };
My_class my_Object_2{ ... };
swap( my_Object_1, my_Object_2 );
它所改变的仅仅是my_Object_1与my_Object_2的object成员值,对于其所指向的内存并不做额外操作。
swap()函数被包含在多个库中,我们常常使用<algorithm>库。如果标准库不能满足你的需求,你可以重载该函数。
move()函数
move()函数用于移动变量,从而避免拷贝所产生的额外开销。move()函数也在多个标准库中,常见于<algorithm>库。
move()函数与移动构造函数搭配使用,这意味着你得有一个有效的移动构造函数。它的函数原型如下
template <typename T>
constexpr T && move( T & ) noexcept
函数原型表明该函数是将左值转换为等值的右值,因此它与移动构造函数一同使用。例如
class My_class
{
private:
...
public:
My_class( My_class && rhs ): ...
{
...
}
...
};
My_class my_Object_1{ ... };
My_class my_Object_2 = std::move( my_Object_1 );
这样一来my_Object_1就会被当作右值使用,之后调用右值构造函数,事实上,my_Object_2就是my_Object_1,而原先的my_Object_1被重置,这在右值构造函数中发生。自始至终都不会发生复制与赋值这样的操作,节约了时间与空间的消耗。
浙公网安备 33010602011771号