实用指南:嵌入式面试高频(十二)!!!C++语言(嵌入式八股文,嵌入式面经)c++11新特性

news/2025/9/28 20:56:19/文章来源:https://www.cnblogs.com/lxjshuju/p/19117591

一.移动语义的原理

移动语义的原理

移动语义是C++11引入的核心特性之一,旨在避免不必要的深拷贝操作,提升性能。其本质是通过将资源(如堆内存、文件句柄等)的所有权从一个对象转移至另一个对象,而非复制资源本身。移动操作后,原对象通常处于有效但未定义的状态(如空指针)。

关键点:

  • 右值引用(T&&:移动语义的基础,绑定到临时对象或显式标记为可移动的对象(通过std::move)。
  • 移动构造函数/赋值运算符:接受右值引用参数,直接“窃取”资源,而非复制。
  • 资源所有权转移:移动后原对象不再拥有资源,避免双重释放。

拷贝(Copy)与移动(Move)的区别

拷贝语义
  • 行为:创建对象的完整独立副本,包括所有资源(深拷贝)。
  • 开销:可能涉及大量内存分配和数据复制。
  • 适用场景:需要保留原对象完整状态的场景。
  • 函数签名
    T(const T& other); // 拷贝构造函数
    T& operator=(const T& other); // 拷贝赋值运算符
移动语义
  • 行为:转移资源所有权,原对象进入“空”状态。
  • 开销:通常仅复制指针或句柄,无深层资源复制。
  • 适用场景:临时对象或明确不再需要原对象的场景。
  • 函数签名
    T(T&& other) noexcept; // 移动构造函数
    T& operator=(T&& other) noexcept; // 移动赋值运算符
对比示例
std::vector a = {1, 2, 3};
std::vector b = a; // 拷贝:a和b独立,各有自己的数据
std::vector c = std::move(a); // 移动:a的资源转移给c,a为空

关键场景

  • 临时对象:编译器自动优先匹配移动语义。
  • 显式移动:通过std::move将左值转为右值引用。
  • 容器操作:如std::vector::push_back的右值重载版本避免复制。

注意事项

  • 异常安全:移动操作通常标记为noexcept,便于标准库优化。
  • 对象状态:移动后原对象应处于可析构状态,但其他操作可能未定义。
  • 默认行为:未显式实现移动语义时,编译器可能回退到拷贝。

二.完美转发的原理

完美转发的概念

完美转发(Perfect Forwarding)是C++中的一种技术,允许函数模板将其参数以原始类型(包括左值、右值、const/volatile限定等)转发给其他函数,保持参数的完整性质。核心目的是解决泛型编程中参数传递时的类型丢失问题。

实现原理

完美转发依赖以下两个关键机制:

  1. 通用引用(Universal Reference)
    使用双类型推导形式 T&&,当模板参数 T 被推导时,T&& 既能绑定左值也能绑定右值。例如:

    template 
    void wrapper(T&& arg) {// arg 可以是左值或右值
    }
  2. std::forward 的转发
    std::forward<T> 根据模板参数 T 的类型决定转发为左值或右值:

    • T 推导为左值引用(如 int&),std::forward 返回左值。
    • T 推导为非引用(如 int),std::forward 返回右值。
      示例:
    template 
    void wrapper(T&& arg) {target(std::forward(arg)); // 保持 arg 的原始类型
    }

典型应用场景

  • 转发函数参数:在工厂模式或中间层函数中,将参数无损传递给底层函数。
  • 避免多余拷贝:对于右值参数直接移动,左值参数保留拷贝语义。

代码示例

#include 
#include 
void target(int&) { std::cout << "左值引用\n"; }
void target(int&&) { std::cout << "右值引用\n"; }
template 
void wrapper(T&& arg) {target(std::forward(arg)); // 完美转发
}
int main() {int x = 42;wrapper(x);       // 调用左值版本wrapper(42);      // 调用右值版本
}

注意事项

  • 模板类型推导:仅当 T 是模板参数时 T&& 才是通用引用,否则为右值引用。
  • const 处理:若参数带 const 限定,std::forward 会保留其常量性。

通过结合通用引用和 std::forward,完美转发实现了参数类型的高保真传递。

三.函数模板与模板函数

函数模板与模板函数的区别

函数模板是一个通用的函数定义,使用模板参数(通常用typenameclass声明)表示类型。它允许编写适用于多种数据类型的代码,而无需为每种类型重复编写函数。例如:

template 
T max(T a, T b) {return (a > b) ? a : b;
}

模板函数是函数模板在具体类型实例化后生成的函数。例如,当调用max<int>(3, 5)时,编译器会根据函数模板生成一个处理int类型的函数。


核心特点

函数模板

  • 是代码的蓝图,未实际编译。
  • 通过模板参数支持泛型编程。
  • 需在调用时或显式实例化时确定具体类型。

模板函数

  • 是函数模板针对特定类型的实例化结果。
  • 实际存在于编译后的代码中。
  • 例如max<int>max<double>

使用场景

函数模板

  • 需要编写通用逻辑时,如容器操作、算法等。
  • 避免为不同类型重复实现相同功能。

模板函数

  • 直接调用时由编译器自动生成。
  • 显式实例化可减少编译时间。

注意事项

  • 函数模板定义通常放在头文件中,因为编译器需在调用时看到完整定义。
  • 模板参数可包含非类型参数(如template <int N>)。
  • 特化或重载函数模板时需注意匹配规则。

示例代码

// 函数模板
template 
void print(T value) {std::cout << value << std::endl;
}
// 模板函数(隐式实例化)
print("Hello");  // 生成 print
print(42);                    // 自动推导为 print

四.智能指针

智能指针概述

智能指针是C++中用于管理动态分配内存的模板类,通过自动释放内存避免内存泄漏。它们封装原始指针,提供类似指针的行为,同时具备自动内存管理的特性。

常见智能指针类型

std::unique_ptr
  • 独占所有权:同一时间只能有一个unique_ptr指向对象,不可复制但可移动。
  • 适用场景:替代需要明确所有权的原始指针。
  • 示例代码
    std::unique_ptr ptr(new int(10));
    auto ptr2 = std::move(ptr); // 所有权转移
std::shared_ptr
  • 共享所有权:通过引用计数管理内存,多个shared_ptr可指向同一对象。
  • 适用场景:需要多个指针共享同一资源的场景。
  • 示例代码
    std::shared_ptr ptr1(new int(20));
    std::shared_ptr ptr2 = ptr1; // 引用计数增加
std::weak_ptr
  • 弱引用:配合shared_ptr使用,不增加引用计数,避免循环引用。
  • 适用场景:解决shared_ptr的循环引用问题。
  • 示例代码
    std::shared_ptr shared(new int(30));
    std::weak_ptr weak = shared;
    if (auto tmp = weak.lock()) { // 检查资源是否有效// 使用tmp
    }

智能指针的优势

  • 自动释放内存:超出作用域时自动调用析构函数。
  • 异常安全:即使发生异常,资源也能正确释放。
  • 减少内存泄漏:避免手动delete导致的遗漏。

注意事项

  • 避免循环引用shared_ptr相互引用会导致内存泄漏,需用weak_ptr打破。
  • 不混用原始指针:同一资源不应同时由智能指针和原始指针管理。
  • 性能开销shared_ptr的引用计数存在额外开销。

自定义删除器

智能指针支持自定义删除逻辑,例如释放文件句柄或网络连接:

std::unique_ptr file(fopen("test.txt", "r"), fclose);

通过合理选择智能指针类型,可显著提升C++代码的安全性和可维护性。

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

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

相关文章

2025 年陶瓷配件厂家 TOP 企业品牌推荐排行榜,电子,氧化铝,氧化锆,氮化铝,工业,精密,结构陶瓷配件,陶瓷柱塞配件,陶瓷刀片配件,陶瓷导轮配件公司推荐

在高端制造产业快速升级的当下,陶瓷配件凭借耐磨、耐高温、绝缘等优异特性,成为电子、航空航天、新能源等领域的核心组件。然而,市场上陶瓷配件品牌数量众多,产品质量参差不齐,材料性能差异显著,从普通氧化铝制品…

做视频网站 视频放在哪多地优化防控举措方便民众生活

团队管理规划有4个互相关联的要素&#xff1a; 职能目标团队路径在未来的3个月&#xff0c;6个月&#xff0c;1年&#xff0c;2年&#xff0c;3年&#xff0c;5年中&#xff0c;你希望带着你的团队抵达一个什么样的目的地&#xff0c;也就是团队的目标。 更加清楚目标意味着什么…

2025-2026-1 20231301 《信息安全设计》第三周学习总结

View Post2025-2026-1 20231301 《信息安全设计》第三周学习总结2025-2026-1 20231301 《信息安全设计》第三周学习总结 目录作业信息学习内容总结杂凑函数概述1. 基本概念2. 核心特性3. 安全要求杂凑函数分类1. 不带密…

SQL逐字稿

古法处理中...

2025攻丝机厂家 TOP 企业品牌推荐排行榜,全自动,半自动,转盘,伺服,平推,全自动钻孔,半自动钻孔攻丝机公司推荐

引言在工业自动化加速渗透的当下,攻丝机作为机械加工领域的关键设备,其性能与稳定性直接影响企业生产效率与产品精度。然而当前市场中,攻丝机产品质量参差不齐,部分设备存在故障率高、精度不足、适配性差等问题,不…

网页中的基本元素有哪些网站优化是往新闻中心发新闻吗

#1.python程序中__name__的作用是什么?__name__这个系统变量用来表示程序的运行方式. 如果程序在当前膜快运行,__name__的名称就是__main__, 如果不在(被调用),则显示为导入模块的名称.扩展:常常这样写if __name__ "__main__":来表名这是整个工程开始运行的入口.效…

实用指南:微信公众号网页调试, 某讯参数,drviceToken V2

实用指南:微信公众号网页调试, 某讯参数,drviceToken V2pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

wap网站开发价格网页页面设计报价

Blazor不得不说真是好东西&#xff0c;极大的提升了开发效率&#xff0c;很多的页面交互功能基本上只需要写很少的代码就能实现了&#xff0c;而且还是无js实现&#xff0c;你也绝对没有想到过&#xff0c;Blazor实现文件上传是有多么简单&#xff01;先说结论&#xff1a;Blaz…

网站建设实训的方法wordpress 图片打开慢

难度困难314 给定一个非空二叉树&#xff0c;返回其最大路径和。 本题中&#xff0c;路径被定义为一条从树中任意节点出发&#xff0c;达到任意节点的序列。该路径至少包含一个节点&#xff0c;且不一定经过根节点。 示例 1: 输入: [1,2,3]1/ \2 3输出: 6示例 2: 输入: …

织梦网站装修公司源码中铁建设集团有几个局

PC 终端作为最主流最高频的生产力工具&#xff0c;其操作系统承载着用户的大量场景、数据以及技能。随着生成式人工智能浪潮的来临&#xff0c;新的技术架构、交互模式和新的生态&#xff0c;都需要操作系统承担起更多责任&#xff0c;即需要新一代的操作系统产品 ——AIOS&…

Excel 转在线协作难题破解:SpreadJS 纯前端表格控件的高效的技术方案与实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年芝麻灰厂家 TOP 企业品牌推荐排行榜,芝麻灰路沿石,花岗岩石材,火烧板,地铺石,板材,挡车球,桥栏杆,楼梯踏步,门牌石,水篦子公司推荐

在石材行业快速发展的当下,芝麻灰凭借坚固耐用、装饰性强的特质,成为市政工程、房地产建设等领域的热门选材。但市场上的芝麻灰厂家数量众多,资质参差不齐,让采购者面临诸多选择难题。部分厂家存在资源储备不足导致…

帮人注册网站_做app可以做网站背景音乐的英文歌曲

随着信息化时代的深入发展&#xff0c;数据库技术作为支撑信息化应用的核心技术&#xff0c;其重要性日益凸显。本次大会以“数据价值&#xff0c;驱动未来”为主题&#xff0c;聚焦数据库领域的前沿技术与最新动态&#xff0c;吸引了数千名业界专家、企业代表和数据库技术爱好…

网站管理密码高端网站建设网站定制

1.右键“此电脑”&#xff0c;点击管理 2.选择“存储”–磁盘管理 3.右键未分配磁盘–新建简单卷 4.一路默认设置即可

北京设计公司网站自己做网站能关联支付宝吗

MoE&#xff08;Mixture of Experts&#xff09;架构在人工智能领域具有以下优势&#xff1a; 1. **表现力强大**&#xff1a;MoE通过融合多个专家模型&#xff0c;能够更好地适应不同输入样本的特点&#xff0c;提高模型的表达能力&#xff0c;从而在处理复杂任务时表现出更高…

手机网站登陆模板安阳seo优化

学习和掌握QT6.3的技巧和入门方法&#xff0c;可以让你更快速地掌握和使用这个开发工具。下面是一些建议和步骤&#xff1a; 学习基础知识&#xff1a;在开始学习QT6.3之前&#xff0c;建议先了解一些基础知识&#xff0c;例如C编程语言和图形用户界面的基本概念等。这些知识可…

做网站所需技术wordpress 首页变量

相信不少同学在开发“微信支付”的时候遇到了无法获取Token的难题&#xff0c;这里贴出我成功获取Token的php源码&#xff1a; 步骤如下&#xff1a; 1&#xff0c;确保你服务器的php环境是搭建好的&#xff0c;意思就是可以正确运行php程序 2&#xff0c;确定微信Token访问你…

网站图片怎样做seo优化东莞网站设计制作

插入排序的最好的情况是O(n)&#xff0c;最坏的情况O(n^2),因此是稳定的 冒泡排序最好的情况是O(n)&#xff0c;最坏的情况O(n^2)因此是稳定的 //插入排序 void insert_sort(int* arr, int n) { int temp -1; for (int i1;i<n;i){ temp arr[i]; int j i - 1; //从后往前…

Node.js 记录删除:完整指南

Node.js 记录删除:完整指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

革吉网站建设网页设计师的发展前景

mixins 是一个 js 对象&#xff0c;它可以包含我们组件中JS部分的任意功能选项&#xff0c;如&#xff1a;data、components、methods、created、computed 等等。我们只要将公用的功能以对象的方式传入 mixins 选项中&#xff0c;当组件使用 mixins 对象时所有 mixins 对象都将…