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

C++值类别与移动语义

一、5秒速记法
std::string s = "Hi";   // s是左值(有名字,可复用)
func(std::move(s));      // 移动后s不再使用(通常置空)auto&& r = getBuffer();  // r绑定临时对象(资源转移)
二、三大必会操作
  1. 移动语义:避免拷贝大对象
// 1. 移动构造(实现资源转移)
class DataHolder {DataHolder(DataHolder&& other) noexcept : ptr(other.ptr), size(other.size) {other.ptr = nullptr;  // 关键:切断原对象所有权}
};
  1. 高效容器操作
 std::vector<BigData> vec;// 旧方式(低效)
-vec.push_back(BigData(1000));  // 构造+复制// 现代方式(高效)
+vec.emplace_back(1000);        // 原位构造
+vec.push_back(std::move(existObj)); // 转移已有对象
  1. 完美转发参数
template<typename T>
void relay(T&& arg) {  // 通用引用process(std::forward<T>(arg)); // 保持值类别
}relay(42);             // 传右值(触发移动)
relay(existObj);       // 传左值(保持原状态)
三、值类别速判表(开发中够用)
表达式类型能否取地址可复用性典型场景
左值 (lvalue)✔️✔️变量名、函数返回引用
将亡值 (xvalue)✔️std::move()返回值
纯右值 (prvalue)临时对象、字面量
四、三大工程铁律
  1. 移动后对象状态

    auto data = loadData(); // 加载资源
    process(std::move(data));// 此时data状态:
    assert(data.empty()); // 必须处于有效但不可预测状态
    
  2. noexcept强制要求

    // 移动构造必须标记noexcept
    DataHolder(DataHolder&&) noexcept;
    

    否则容器操作会退化到拷贝

  3. 工厂函数优化模式

    template<typename T, typename... Args>
    T create(Args&&... args) {return T(std::forward<Args>(args)...);
    }
    auto obj = create<BigObject>(1024); // 避免临时对象
    
五、常见避坑指南
  1. 不要移动基本类型

    int x = 10;
    int y = std::move(x); // 无意义,仍为复制
    
  2. 谨慎返回局部对象

    // 错误:阻止编译器优化
    BigObject func() {BigObject obj;return std::move(obj); // 禁用RVO
    }// 正确:依赖编译器优化
    BigObject func() {return BigObject(); // 自动触发RVO/NRVO
    }
    
  3. API设计原则

    // 接收右值参数(强制调用方转移所有权)
    void takeOwnership(BigData&& resource);// 接收任意值(保留值类别)
    template<typename T>
    void processResource(T&& resource);
    

推荐:C++学习一站式分享

http://www.xdnf.cn/news/15261.html

相关文章:

  • GraphRAG Docker化部署,接入本地Ollama完整技术指南:从零基础到生产部署的系统性知识体系
  • 动物世界一语乾坤韵芳华 人工智能应用大学毕业论文 -仙界AI——仙盟创梦IDE
  • 板凳-------Mysql cookbook学习 (十一--------9)
  • Typecho分类导航栏开发指南:从基础到高级实现
  • axios拦截器
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频摘要快速生成与检索优化(345)
  • Oracle SQL - 使用行转列PIVOT减少表重复扫描(实例)
  • 前端-CSS-day3
  • 【FreeRTOS】事件组
  • 决策树学习
  • OneCode3.0 VFS分布式文件管理API速查手册
  • 网络安全的基本练习
  • Autosar CanSM配置-Busoff参数-基于ETAS软件
  • 齿轮主要的几项精度指标及检测项目学习
  • houdini vat 学习笔记
  • 日志不再孤立!用 Jaeger + TraceId 实现链路级定位
  • 力扣刷题(第八十五天)
  • 【CMake】CMake构建项目入门
  • 【华为OD】MVP争夺战(C++、Java、Python)
  • 多表查询-4-外连接
  • 使用包管理工具CocoaPods、SPM、Carthage的利弊与趋势
  • 【机器学习入门巨详细】(研0版)二创OPEN MLSYS
  • CTFHub————Web{信息泄露[Git泄露(Stash、Index)]}
  • Linux进程管理的核心:task_struct中的双链表与网状数据结构
  • 数据结构之并查集和LRUCache
  • Waiting for server response 和 Content Download
  • Pandas 模块之数据的读取
  • 骁龙8 Gen4前瞻:台积3nm工艺如何平衡性能与发热
  • 【leetcode】709. 转换成小写字母
  • 赋能家庭、行业与工业场景,智微智能新一代Twin Lake 全栈智能终端发布