当前位置: 首页 > news >正文

编程笔记 - C++ 移动语义

C++11 引入了移动语义,它的出现主要是为了解决对象频繁拷贝带来的性能开销问题。移动语义的核心思想是:当对象的资源不再需要时,可以“转移”它的内部资源,而不是进行昂贵的深拷贝。

背景

在传统 C++ 中,函数参数传递或者返回值通常依赖拷贝构造函数。比如,在调用函数前,通常需要在调用者的作用域中创建一个(右值)对象,然后作为参数传递到函数内部,根据传入的参数创建对象,这一过程就产生了拷贝开销。再比如,在函数返回时,需要将函数内部创建的对象作为返回值返回,也需要进行对象拷贝,函数内的对象离开了作用域就会被销毁。

std::string foo() {std::string s = "hello world";return s;
}
左值与右值

简单地说,C++ 中的左值(lvalue)是指向内存区域的变量,它可以出现在赋值表达式的左边或者右边;右值(rvalue)是不可寻址的常量,或者在表达式求值过程中无名的临时对象,只能出现在赋值表达式的右边。

左值引用和右值引用

左值引用就是对变量的引用,对左值引用的操作就是对应内存的操作,一般声明语法是 T&。右值引用用于绑定一个临时的对象,并延长其生命周期到作用域结束,一般声明语法是 T&&

移动构造和移动赋值

为了解决拷贝开销,C++11 引入了移动构造函数和移动赋运算符,它们的函数签名如下:

class MyClass {
public:MyClass(MyClass&& other);            // 移动构造MyClass& operator=(MyClass&& other); // 移动赋值
};

示例

#include <iostream>
#include <vector>class Buffer {int* data;size_t size;
public:Buffer(size_t n) : size(n), data(new int[n]) {std::cout << "Construct\n";}~Buffer() {delete[] data;}// 拷贝构造Buffer(const Buffer& other) : size(other.size), data(new int[other.size]) {std::cout << "Copy Construct\n";std::copy(other.data, other.data + size, data);}// 移动构造Buffer(Buffer&& other) noexcept : size(other.size), data(other.data) {std::cout << "Move Construct\n";other.data = nullptr;other.size = 0;}
};int main() {std::vector<Buffer> vec;vec.reserve(2);vec.push_back(Buffer(10)); // 临时对象 => 移动构造Buffer b(20);vec.push_back(std::move(b)); // 显式转移 => 移动构造
}

运行结果

Construct
Move Construct
Construct
Move Construct

可以看到,上述两个操作都没有触发拷贝构造。第一次调用 push_back() 时传入的是临时构造的一个 Buffer 对象,它是右值,因此被 Buffer(Buffer&& other) 构造函数捕获,将这个临时对象的所有权转移到当前对象。

第二次调用 push_back() 时传入的是 std::move(b),这里 move 是一个类型转换工具,用于将左值强制转换为右值引用,以便触发移动语义。因此,当前对象使用传入的 b 的右值引用进行移动构造,将 b 的所有权转移到当前对象。此时 b 的状态被置为资源已转移但仍可析构的状态,不应再使用原有的内容。

总而言之,C++ 移动语义通过右值引用支持资源转移,避免拷贝开销。std::move() 用于显式地出发移动语义,使用后的对象处于“已转移”的状态。C++ 的移动语义常用于函数参数传递、函数返回值传递、容器和字符串插入等场景。

http://www.zskr.cn/news/17216.html

相关文章:

  • 2025 年最新推荐压电陶瓷制造厂家:深度解析品牌价值、市场影响力及高性价比选型指南高D33/pzt/高性能/替代进口/高稳定性压电陶瓷厂家推荐
  • 对vue的疑惑
  • 2025 年最新保温装饰一体板厂家口碑排行榜:优选西宁及全国靠谱生产厂家,助力建筑项目精准选品装配式一体板 / 装配式复合一体板 / 珍珠岩复合保温一体板 / 免拆保温一体板厂家推荐
  • 浏览器标签管理
  • 洛谷9695 [GDCPC 2023] Traveling in Cells 题解(线段树+二分)
  • Axure 下拉框联动 - 实践
  • 题解:qoj6170 凸多边形正则划分问题
  • linux 中paste命令实现按照指定列数输出文件
  • 2025 年章丘二手磁选机服务公司最新推荐榜单:含回收置换 / 全型号设备及优质售后企业权威排行
  • 2025 年最新铝镁锰板厂商口碑排行榜:实力厂家推荐及 100 万㎡工程案例与 20 年质保深度解读铝镁锰板屋面板/保温板/卷/墙面板 铝镁锰板金属屋面板
  • 2025 年次氯酸钠发生器厂家最新推荐榜:覆盖电解法 / 食盐电解等类型,聚焦专利技术与成本优势的品牌深度解析水厂/大型/小型/食盐电解产生次氯酸钠发生器厂家推荐
  • 2025 年二氧化氯发生器厂家最新推荐排行榜:电解式设备厂家综合实力测评及优质企业选购指南电解/电解法/电解食盐/电解盐二氧化氯发生器厂家推荐
  • 2025 年国内磁选机厂家最新推荐排行榜:立环 / 高梯度 / 油冷立环磁选机优质厂商实力解析
  • 2025 年最新三维扫描仪厂家权威推荐排行榜:空间 / 高精度 / 手持激光等类型设备优选企业全解析工业/便携式/拍照式/蓝光三维扫描仪厂家推荐
  • 2025 年北京红旗国悦经销商最新推荐排行榜:行业标杆与新锐品牌齐聚,购车选品指南重磅发布北京丰田考斯特/北京红旗国悦12座/北京考斯特4S店/北京丰田柯斯达/北京考斯特商务车经销商推荐
  • 题解:[P11184 带余除法]
  • 10 8
  • 高考数学易错考点01 | 临阵磨枪 - 教程
  • 2025 年西宁口腔医院最新推荐排行榜:实力解析与全周期口腔服务指南西宁口腔医院/西宁口腔美容/西宁口腔整形/西宁口腔正畸/西宁口腔修复推荐
  • 2025 土工材料厂家最新推荐榜:中铁合作厂商领衔,技术 / 案例双维度厂家深度甄选指南土工布/土工膜/土工格栅/复土工合膜厂家推荐
  • 2025 年帐篷源头厂家最新推荐排行榜:涵盖应急救灾 / 户外充气 / 露营充气 / 野营等品类,精选实力企业助采购
  • 2025 杀虫公司最新推荐榜:权威筛选公司,靶向消杀与长效质保选购全指南
  • 2025 年电缆桥架生产厂家最新推荐榜单:聚焦北方 / 河北区域及多类型桥架,精选优质品牌深度解析瓦楞/防火/模压/镀锌桥架厂家推荐
  • 2025 商事律师咨询最新推荐榜:权威甄选专业法律服务品牌武汉公司法商事/武汉股东纠纷股权/武汉商事争议解决/武汉公司法股权律师推荐
  • VSCODE - 实践
  • sqlite-loadable-rs rust 开发sqlite 扩展
  • 30年后摘得诺奖,一个叛逆“东亚小孩”的胜利
  • 2025年诺贝尔物理学奖揭晓,其中两位得主曾获“墨子量子奖”
  • Ambient Occlusion(环境光遮蔽
  • 龙芯是被gcc正儿八经支持的