现代 C++(C++11 及以后)的移动语义

现代 C++(C++11 及以后)的移动语义(Move Semantics),核心就是一句话:

把一个对象"里的资源"直接转给另一个对象,而不是复制一份。

  1. 一句话解释
  • 拷贝:把对象内容复制一份,两个对象各有一套资源。

  • 移动:把原对象的资源直接"抢过来",原对象变成空/无效状态,不复制内存。

适合场景:

对象马上就要被销毁(临时对象、函数返回值),没必要完整拷贝,直接拿走资源更快。

  1. 关键概念

(1)右值 & 左值

  • 左值:有名字、能取地址,能多次使用(如变量)

  • 右值:临时值,用完就丢(如 a + b 、 函数返回值 )

移动语义就是专门用来优化右值的。

(2)右值引用 T&&

用来标记"可以被移动"的对象:

cpp

int&& a = 10; // 10 是临时值,用右值引用绑定

(3)移动构造 / 移动赋值

类里新增两个特殊成员函数,接管资源:

cpp

// 移动构造

MyClass(MyClass&& other) noexcept {

// 直接拿走 other 的指针/资源

data_ = other.data_;

other.data_ = nullptr; // 原对象置空

}

// 移动赋值

MyClass& operator=(MyClass&& other) noexcept {

// 释放自身资源

// 拿走 other 资源

// 置空 other

return *this;

}

(4) std::move

把左值强行转成右值,告诉编译器:

"我不用这个对象了,你可以移动它。"

cpp

MyClass a;

MyClass b = std::move(a); // 移动,不是拷贝

  1. 为什么要用移动语义?

对带堆内存、大容器的对象性能提升巨大:

  • vector<string> 、 string 、 unique_ptr 等

  • 函数返回大对象时,不再深拷贝,直接移动

以前 C++98 只能靠返回值优化(RVO),现在移动语义是语言级保证。

  1. 简单对比示例

cpp

string a = "hello";

string b = a; // 拷贝,慢

string c = move(a); // 移动,快,a 变为空

  1. 总结
  • 移动语义 = 资源转移,而非复制

  • 靠 T&& 、移动构造/赋值、 std::move 实现

  • 大幅提升临时对象、返回值、容器性能

  • STL 容器(vector/string/map 等)默认都支持移动

相关推荐
夏天的峰没有风3 分钟前
Typora+gitcode+picgo搭建免费图床
开发语言·ios·swift
旺仔老馒头.7 分钟前
【C++】类和对象(三)
开发语言·c++·程序人生·类和对象
Zklys7 分钟前
Cmake的学习笔记step1
c++·笔记·学习
右耳朵猫AI7 分钟前
Java & JVM技术周刊 2026年第19周
java·开发语言·jvm
zincsweet9 分钟前
C++ 实现进程池:主从架构、管道通信与任务调度
linux·c++
han_hanker10 分钟前
Java 对象序列化
java·开发语言
zhojiew10 分钟前
通过Toxiproxy从原理到实践理解混沌工程
开发语言·php
雪之下雪乃的代码日记15 分钟前
认识Java中集合框架
java·开发语言·笔记
草莓熊Lotso15 分钟前
【CMake】静态库的编译、链接与引用全解析
linux·c语言·数据库·c++·软件工程·cmake
少司府16 分钟前
C++进阶:继承
c语言·开发语言·c++·继承·组合·虚继承