卡码笔记
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 基础与语法

  • 面向对象

  • STL 与容器

  • 内存管理

  • C++11 与现代 C++

    • C++11中的新特性有哪些
    • C++11中的多线程编程
    • 左值引用和右值引用的区别
    • 移动语义有什么作用,原理是什么
      • 简要回答
      • 详细回答
      • 代码示例
      • 知识拓展
    • 完美转发的作用及实现
    • 说一下c++中stdmove与stdforward的区别
    • 说一下lambda函数
    • 仿函数与lambda性能对比
    • c++中 STL中仿函数与lambda表达式的性能对比
    • C++中的RAII机制
    • C++中的异常处理机制
    • C++中的协程概念及实现
  • 智能指针

  • 并发与 I/O

# 移动语义有什么作用,原理是什么

# 简要回答

移动语义允许资源所有权的转移而非复制,通过右值引用(T&&)实现,显著提升性能,特别是对于管理资源的类(如容器、字符串)。

就是让对象实现搬家的目的,而非克隆,把资源给了新对象,省去了复制开销的细节,速度更快。

# 详细回答

  1. 作用原理:

利用右值引用(T&&)标识临时对象/可移动对象

移动构造函数/赋值运算符直接"窃取"源对象的资源

将源对象置于有效但未定义状态(通常为空)

避免了深拷贝带来的性能损耗

  1. 关键机制:

右值引用绑定到临时对象(右值)

移动操作后源对象必须保持可析构状态

通过std::move将左值转为右值引用 (std::move其实不移动任何东西,只是告诉编译器"这个可以移动")

编译器在特定场景自动使用移动语义(如返回值优化)

# 适用场景

传递大数据时不想复制(比如整个vector)

函数返回临时对象时

管理文件、网络连接等资源的类

排序、洗牌等重新排列元素的操作

写模板代码时保持参数特性

# 代码示例

class String {
    char* data;
public:
    // 移动构造函数
    String(String&& other) noexcept
        : data(other.data) {  // 窃取资源
        other.data = nullptr; // 置空源对象
    }

    // 移动赋值运算符
    String& operator=(String&& other) noexcept {
        if (this != &other) {
            delete[] data;    // 释放现有资源
            data = other.data;// 窃取资源
            other.data = nullptr;
        }
        return *this;
    }

    ~String() { delete[] data; }
    // ... 其他成员函数
};

void demo() {
    String s1("Hello");
    String s2 = std::move(s1); // 移动构造
    String s3;
    s3 = std::move(s2);        // 移动赋值

    std::vector<String> vec;
    vec.push_back(String("World")); // 自动使用移动
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 知识拓展

  • 知识图解

image

  • 面试官可能追问
  1. std::move做了什么?为什么它自己不移动任何东西?

std::move只是无条件转换为右值引用

实际移动操作由类的移动构造函数/赋值运算符完成

设计上分离了"移动许可"和"移动实现"

  1. 移动后源对象的状态要求?

必须处于有效但未指定状态

必须允许析构和赋值

典型实现是将源对象的指针置nullptr

  1. 什么时候编译器会自动使用移动语义?

函数返回局部对象时(RVO/NRVO)

抛出异常时,临时对象初始化新对象时

容器重新分配内存时(如vector扩容)

  1. 如何判断一个类是否该实现移动语义?

类管理外部资源(内存、文件句柄等)

移动比拷贝能显著提高性能

拷贝代价高或不可用(如unique_ptr)

Last Updated: 3/10/2026, 6:08:48 PM

← 左值引用和右值引用的区别 完美转发的作用及实现 →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪