C++ 新特性 | C++ 11 | 移动语义

文章目录

  • 一、移动语义
    • 1、为什么需要移动语义?
    • 2、怎么“偷”?——右值引用(`&&`)
    • 3、如何实现移动语义?——移动构造函数/赋值
    • 4、什么时候触发移动?
    • 5、移动 vs 拷贝

一、移动语义

1、为什么需要移动语义?

传统拷贝(=)会复制整个对象,但如果对象很大(如 vector<string>),拷贝开销大。
移动语义的核心思想:“偷资源”,避免不必要的深拷贝,提升性能。

2、怎么“偷”?——右值引用(&&

  • 右值(临时对象、字面量等) 的生命周期短,可以安全“偷”它的资源。
  • 右值引用 && 用来绑定右值,表示“这个值可以移动”。

示例:

std::string s1 = "Hello";
std::string s2 = std::move(s1);  // 把 s1 的资源“偷”给 s2
  • s1 变成空(资源被移动),s2 直接接管原内存,没有拷贝

3、如何实现移动语义?——移动构造函数/赋值

类需要定义移动构造函数移动赋值运算符

class MyObject {
public:// 移动构造函数(参数是右值引用)MyObject(MyObject&& other) noexcept {data_ = other.data_;  // 直接“偷”指针other.data_ = nullptr;  // 原对象置空}// 移动赋值运算符MyObject& operator=(MyObject&& other) noexcept {if (this != &other) {delete data_;      // 释放自己的资源data_ = other.data_;  // “偷”对方的资源other.data_ = nullptr;}return *this;}private:int* data_;  // 假设管理动态内存
};

关键点:

  • 直接“窃取”资源(如指针),避免深拷贝。
  • 把原对象的资源置空(防止重复释放)。

4、什么时候触发移动?

  • 显式移动std::move(obj) 强制转成右值引用。
  • 隐式移动:函数返回临时对象时(编译器优化)。

示例:

std::vector<int> createBigVector() {std::vector<int> v = {1, 2, 3, 4, 5};return v;  // 编译器可能优化为移动(而非拷贝)
}auto v = createBigVector();  // 移动构造,无拷贝

5、移动 vs 拷贝

拷贝移动
操作深复制(完整备份)“偷”资源(直接接管)
开销高(内存、时间)低(仅指针交换)
原对象保持不变被置空(资源转移)

一句话总结:

移动语义通过 &&std::move “偷”临时对象的资源,避免深拷贝,提升性能。适用于管理动态内存的类(如 vectorstring、自定义资源类)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wsl下ubuntu安装宝塔

在 WSL (Windows Subsystem for Linux) 下的 Ubuntu 中安装宝塔面板的步骤如下&#xff1a; 1. 确保 WSL 环境正常 已安装 WSL 2 并启用 Ubuntu 发行版&#xff08;推荐 Ubuntu 20.04/22.04&#xff09;。 在 PowerShell 中检查 WSL 版本&#xff1a; wsl --list --verbose 如…

UDP网络通信

UDP网络通信&#xff1a; 步骤1 创建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);参数一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…

教你快速理解linux中的NUMA节点探测是干什么用的?

想象一个大城市被划分成几个区&#xff08;比如东区、西区&#xff09;。每个区有自己的超市&#xff08;内存&#xff09;&#xff0c;居民&#xff08;CPU&#xff09;去本区的超市买东西最快&#xff0c;去其他区的超市会慢一些。 NUMA节点探测&#xff0c;就是Linux系统在…

使用 Less 实现 PC 和移动端样式适配

&#x1f310; 使用 Less 实现 PC 和移动端样式适配 —— 以 position 属性为例 在前端开发中&#xff0c;我们常常会遇到这样一个场景&#xff1a; 在 PC 页面中需要某个元素是 position: relative;&#xff0c;但在移动端却希望它是 position: inherit;&#xff0c;以便更灵…

企业战略管理(设计与工程师类)-2-战略规划及管理过程-1-概述

战略管理过程 参考资料&#xff1a; 战略管理 - 清华大学- 蔡临宁公司战略与风险管理 - 华中科技大学 - 贺远琼战略管理 - 北京理工大学 - 杨万荣DeepSeek - 深度思考与联网检索 AFI框架 战略管理最典型的就是采用传统的AFI通用战略管理框架&#xff08;模型&#xff09;&a…

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并发原理以及技术实现对比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架虽然都支持高并发&#xff0c;但它们的实现原理、底层机制和适用场景有显著差异。以下从 高并发原理、技术实现区别、优缺点 三个方面详细分析&#xff1a; 一、高并发实现原理 1. Hyperf (PHP Swoole) Hyperf 的高并发能力基于 Swoo…

【教程】如何利用bbbrisk一步一步实现评分卡

利用bbbrisk一步一步实现评分卡 一、什么是评分卡1.1.什么是评分卡1.2.评分卡有哪些 二、评分卡怎么弄出来的2.1.如何制作评分卡2.2.制作评分卡的流程 三、变量的分箱3.1.数据介绍3.2.变量自动分箱3.3.变量的筛选 四、构建评分卡4.1.评分卡实现代码4.2.评分卡表4.3.阈值表与分数…

AI日报 - 2025年4月2日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | 研究揭示零RL训练可诱发模型顿悟&#xff0c;Anthropic发布Claude 3.5内部机制研究&#xff0c;简化语言模型推理优化新方法提出。 DeepSeek-R1无需额外指令即可深度推理&#xff1b;Anthro…

探索 Kubernetes 网络穿透:如何从外部访问 K8s Pod 地址

文章目录 探索 Kubernetes 网络穿透&#xff1a;如何从外部访问 K8s Pod 地址为什么需要外部访问 Pod 地址&#xff1f;常见的网络穿透方案NodePortLoadBalancerIngressPort-ForwardHostNetworkkt-connect&#xff1a;为开发调试提供便捷穿透 实践建议与注意事项各方案对比表总…

深入理解 Apache Dagster:数据管道编排实战指南

本文系统介绍了 Apache Dagster 的核心概念与实践方法&#xff0c;涵盖环境搭建、管道定义、运行调试及高级功能&#xff0c;帮助开发者快速掌握这一现代化数据编排工具&#xff0c;提升数据工程效率。 1. 背景与核心优势 随着数据驱动应用的复杂化&#xff0c;传统工具在可维…

Minio集群部署

Minio集群部署 资源规划 IP服务规划配置192.168.116.138minio-116核32G磁盘10T192.168.116.139minio-216核32G磁盘10T192.168.116.140minio-316核32G磁盘10T192.168.116.141minio-416核32G磁盘10T192.168.116.128nginx代理8核16G磁盘500G 基本环境配置 下面命令minio4台设备…

操作系统高频(六)linux内核

操作系统高频&#xff08;六&#xff09;linux内核 1.内核态&#xff0c;用户态的区别⭐⭐⭐ 内核态和用户态的区别主要在于权限和安全性。 权限&#xff1a;内核态拥有最高的权限&#xff0c;可以访问和执行所有的系统指令和资源&#xff0c;而用户态的权限相对较低&#x…

强大而易用的JSON在线处理工具

强大而易用的JSON在线处理工具&#xff1a;程序员的得力助手 在当今的软件开发世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已经成为了数据交换的通用语言。无论是前端还是后端开发&#xff0c;我们都经常需要处理、验证和转换JSON数据。今天&a…

【学习记录】pytorch载入模型的部分参数

需要从PointNet网络框架中提取encoder部分的参数&#xff0c;然后赋予自己的模型。因此&#xff0c;需要从一个已有的.pth文件读取部分参数&#xff0c;加载到自定义模型上面。做了一些尝试&#xff0c;记录如下。 关于模型保存与载入 torch.save(): 使用Python的pickle实用程…

【蓝桥杯14天冲刺课题单】Day 8

1.题目链接&#xff1a;19714 数字诗意 这道题是一道数学题。 先考虑奇数&#xff0c;已知奇数都可以表示为两个相邻的数字之和&#xff0c;2k1k(k1) &#xff0c;那么所有的奇数都不会被计入。 那么就需要考虑偶数什么情况需要被统计。根据打表&#xff0c;其实可以发现除了…

鸿蒙ArkTS开发:微信/系统来电通话监听功能实现

本文将介绍如何在鸿蒙应用中使用ArkTS实现通话监听和录音功能&#xff0c;利用harmony-utils工具库简化开发流程。 工具库地址 一、功能概述 本实现包含以下核心功能&#xff1a; 通话状态监听&#xff1a;检测来电、去电和通话中状态 音频流监控&#xff1a;通过麦克风使用…

NFS 重传次数速率监控

这张图展示的是 NFS 重传次数速率监控&#xff0c;具体解释如下&#xff1a; 1. 指标含义 监控指标 node_nfs_rpc_retransmissions_total 统计 NFS&#xff08;网络文件系统&#xff09;通信中 RPC&#xff08;远程过程调用&#xff09;的重传次数&#xff0c;rate(node_nfs_…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的国际化:支持多语言的 RESTful API

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…

黑帽SEO之搜索引擎劫持-域名劫持原理分析

问题起源 这是在《Web安全深度剖析》的第二章“深入HTTP请求流程”的2.3章节“黑帽SEO之搜索引擎劫持”提到的内容&#xff0c;但是书中描述并不详细&#xff0c;没有讲如何攻击达到域名劫持的效果。 书中对SEO搜索引擎劫持的现象描述如下&#xff1a;直接输入网站的域名可以进…

theos工具来编译xcode的swiftUI项目为ipa文件

Theos 是一个开源的开发工具套件&#xff0c;主要用于为 iOS/macOS 平台开发和编译 越狱插件&#xff08;Tweaks&#xff09;、动态库、命令行工具等。它由 Dustin Howett 创建&#xff0c;并被广泛用于越狱社区的开发中。但这里我主要使用它的打包ipa功能&#xff0c;因为我的…