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_1my_Object_2object成员值,对于其所指向的内存并不做额外操作。

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被重置,这在右值构造函数中发生。自始至终都不会发生复制与赋值这样的操作,节约了时间与空间的消耗。

posted @ 2025-03-20 23:31  永恒圣剑  阅读(115)  评论(0)    收藏  举报