第二十六篇,C++面经之问答(五)

2023-05-16

一、new/delete和malloc/free的区别

  1. new/delete是C++的关键字、操作符,malloc/free是C的函数,需引入<stdlib.h>。
  2. new会调用构造函数会初始化并返回相应的数据类型,malloc无构造函数可调且返回void*需要强转,且需传入申请的字节大小,而new会根据数据类型自动确定大小;
  3. new失败抛出bad_alloc异常,malloc失败返回NULL;
  4. delete会调用析构函数,free不会也无析构可调;
  5. new/delete效率低,底层封装的是malloc/free,但应用大大扩展了、方便了。

二、频繁new/delete造成内存碎片的问题怎么解决

使用内存池化技术。
底层重载malloc()、free()函数,使用方重载new、delete操作符;
池化的方式一般和要解决的问题的数据类型有关联,即每个空间单元的字节大小;当然也可以无关联,做更通用化的。
一篇挺好的代码链接:
https://blog.csdn.net/K346K346/article/details/49538975

三、dynamic_cast和static_cast的区别

  1. dynamic_cast进行安全性检查,如转换失败将返回nullptr或引用时抛出异常,static_cast转换失败时仍会返回指针,但使用有风险;
  2. dynamic_cast一般用在多态中,将父类指针/引用转换成子类;
  3. dynamic_cast的对象必须有虚函数,因为运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,static_cast无此限制;
  4. dynamic_cast工作在运行时,static_cast工作在编译时。

四、C++的类型安全手段

类比C语言:

  1. new/delete对比malloc/free,不再需要强制类型转换;
  2. 模板函数对void*,不再需要强制类型转换;
  3. const对宏,宏只是文本展开,可能造成错误;const是变量定义,意义明确,无此隐患;
  4. dynamic_cast,强化了安全检查机制。

五、哪里用大端哪里用小端

大端:数据高字节存放于内存低地址,Motorola处理器,芯片、网络数据传输;
小端:数据高字节存放于内存高地址,Intel x86处理器,编程;
至于大端更符合人的阅读习惯这个事,写一个多字节的16进制数比较一下大小端就看出来了,注意内存地址要从上到下竖着排,且内存低地址排在最上边:
https://blog.csdn.net/cuishumao/article/details/11777467

六、讲一下RAII

Resource acquisition is initialization.
资源获取即初始化,常见于智能指针、锁。
说到这个话题,也是我开悟C++ OOP编程的起点,突然就悟了,以前是多么的C with class,有之前写的文章为证:
https://blog.csdn.net/qq_42466012/article/details/124718492

七、git rebase的作用

一方面是合并几次连续的commit,精简commit历史;
另一方面是相对于git merge,merge会使得commit历史轨迹虽完整但不清晰,而rebase会呈现出单条开发线一路向前的表现,逻辑清晰,易于理解开发历史。

八、字节对齐的作用

字节对齐是CPU用空间换时间的做法,以提高内存读写的效率;因为CPU是按块读取的,如2字节、4字节、8字节,如果不对齐,会发生数据丢弃、拼接,影响效率。
在结构体或类中,按照变量声明的顺序,每个变量的起始地址相对于该结构体或类的0地址的偏移量,均是其字节大小的整数倍,因此如果它前边所有变量字节数的和不足此整数倍,需要补齐;所有变量的地址计算完成之后可能还需一次补齐,即找出所有变量中最大的字节数,总字节数需按此最大字节数的整数倍补齐。
https://blog.csdn.net/qq_41909314/article/details/89811606

九、为什么引入nullptr替代NULL

关键还是在于C++新增了函数重载机制,以及把NULL的宏定义直接改成了0(在C语言中对NULL的宏定义是((void*)0),即强转为了空指针),带来了困扰。
在C++加入重载并把NULL重新定义成0以后,问题就来了,假如重载两个函数:
void func(void* p);
void func(int a);
如此调用func(NULL),我们本意是让它执行第一个函数,但实际执行了第二个,也就是说直接把NULL当0传进去了,这就引发了二义性;这里还和编译器具体实现相关,有些编译器中会直接报ambiguous的error。
而对nullptr的宏定义是明确的空指针,不会引发歧义。

十、常用数据结构

数组、链表、树、图、哈希表、队列、堆、栈,共计8种。
推荐链接:八种数据结构大全

十一、生产消费模式中的cv

这个是我自创的一个问题,两个cv、一个mutex、notify_one()和notify_all()。
在学习生产消费模式的时候,发现用一个cv和用两个cv的困惑,并深入理解了wait()、notify_one()和notify_all()的效果。
无论是分析别人的代码还是修改代码,都没有看出用一个cv和用两个cv的区别,好像一个就够了,于是提了个问题,解答虽然是ChatGPT的,但总算引导我解了症结。

  1. 关键是多个生产者多个消费者在阻塞,如果一个cv,那它notify之后尤其notify_one()之后,由于生产消费线程共用同一个cv,则无法控制被唤醒的是生产者还是消费者,若此时数据队列为空但恰好唤醒了又一个消费者,则被唤醒者空跑一轮,虽不造成错误但造成CPU浪费;生产者消费者分别用各自的cv,则能做到精准控制,在生产者线程中唤醒消费者,在消费者线程中唤醒生产者,不仅精准而且逻辑清晰。
  2. 共用一个mutex是必须的,因为所有生产者消费者操作的是同一个数据队列,对它做互斥。
  3. 而wait()的逻辑是先释放锁以释放锁资源供其它线程竞争,然后等待唤醒,然后上锁,操作都是原子的,保证了互斥操作的正确性。
  4. notify_one()和notify_all(),notify_one()是唤醒线程队列中的第一个;notify_all()唤醒所有休眠线程,它们竞争临界资源,胜者执行处理流程,而此时CPU消耗巨大因为竞争败者不再进入休眠而是持续竞争,即不再进入被唤醒队列,直到都获取过一次临界资源。
    推荐这篇文章,有些东西想着想着突然就悟了。。。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第二十六篇,C++面经之问答(五) 的相关文章

  • 定位,浮动,BFC

    文章目录 1 xff0c 定位1 margin 与 padding 区别 xff1a 2 定位 xff1a 2 xff0c 元素分类 xff0c 浮动 xff0c BFC1 1 常见块级元素 xff1a 1 2 常见行内元素 xff1a 1
  • 表排序

    文章目录 表排序 表排序 思想 当待排数组中的元素不是简简单单的整数 xff0c 而是复杂的结构体 xff0c 那么移动元素所花费的时间就不能忽略不计了 xff0c 这时候我们要减少元素之间移动的次数了 表排序就是这么一个排序 xff0c
  • 循环链表的实现

    循环链表的实现 说明 参考资料 传智播客扫地僧的数据结构教学视频 线性表基本知识 参考 该实现的说明 C语言实现基于单向链表 xff0c 参考实现算法和数据的分离 实现 circular list h span class token ma
  • Ubuntu20.04安装与配置记录

    Ubuntu20 04安装与配置记录 原文地址 xff1a Ubuntu20 04安装与配置记录 一 Ubuntu系统盘制作 1 1 Windows环境下制作系统盘 下载Ubuntu系统 xff0c 选择桌面版 下载工具系统盘制作工具Ruf
  • C++单例写法记录

    C 43 43 单例写法记录 源码地址 一 饿汉式 1 1 静态指针 静态垃圾回收类 instance h ifndef INSTANCE H define INSTANCE H include lt string gt include l
  • 堆栈应用:表达式求值(C语言)

    文章目录 堆栈应用 xff1a 表达式求值 xff08 C语言 xff09 两个定义大致过程具体代码 堆栈应用 xff1a 表达式求值 xff08 C语言 xff09 两个定义 中缀表达式 xff1a 运算符号位于两个运算数之间 如 xff
  • andrsoid studio 长期编辑

    andrsoid studio 2020 02 08 修改build gradle配置 Top level build file where you can add configuration options common to all s
  • 使用 Maven 搭建 Mybatis 环境

    一 创建项目 1 点击 File gt New gt Module 2 选择左侧的 Maven xff0c 由于只是创建一个普通的项目 xff0c 此处点击 Next 即可 3 输入 GroupId 和 ArtifactId 4 配置 ma
  • ubuntu安装npm命令

    ubuntu安装npm命令 摘要 xff1a npm全称Node Package Manager xff0c 是node的包管理工具 xff0c 是用JavaScript写出来的工具 xff0c 被内置进了node中 xff0c 是随同No
  • zynq操作系统: Linux驱动开发AXIDMA篇

    前言 由于bram形式的速率限制 xff0c 在同样紧急的时间条件下 xff0c 还是改回了axidma的方式来降维打击 xff0c 对于几兆的速率 xff0c 颇有种杀鸡用牛刀的感觉 xff0c 没办法 xff0c 原来的刀就是差一点 x
  • C# 对RabbitMQ使用

    1 安装NuGet包RabbitMQ Client 2 生产者 确认机制 1 含义 xff1a 就是应答模式 xff0c 生产者发送一条消息之后 xff0c Rabbitmq服务器做了个响应 xff0c 表示收到了 2 特点 xff1a 异
  • CSS—— grid 网格布局

    文章目录 1 grid 网格布局 1 grid 网格布局 display gridgrid 属性是以下属性的简写属性 默认 grid gap xff0c none xff0c 200px 网格之间的距离grid template rows
  • 【图文解析】给定一个链表,判断链表中是否有环

    目录 例题描述解题思路代码实现 例题描述 给定一个链表 xff0c 判断链表中是否有环 为了表示给定链表中的环 xff0c 我们使用整数 pos 来表示链表尾连接到链表中的位置 xff08 索引从 0 开始 xff09 如果 pos 是 1
  • Centos7执行yum install *时出现“Peer‘s Certificate has expired.“

    一 引言 今天在安装OpenResty的时候 xff0c 出现了 34 Peer 39 s Certificate has expired 34 的问题 xff0c 详细错误如下 xff1a root 64 kubernetes sudo
  • git常用指令

    1 查看分支创建来源 指令 xff1a git reflog show 分支名 由图可以看出a分支是由master创建出来的 2 查看分支情况 查看远程分支 指令 xff1a git branch r 查看所有分支 指令 xff1a git
  • 利其器(2)——idea常用配置_提高开发效率

    文章目录 简介编码设置设置idea支持生成唯一序列化id全字母代码提示调出Run Dashboard显示方法分隔符忽略大小写提示自动导入包单行显示多个Tabs设置鼠标滚轮 43 96 ctrl 96 修改字体大小设置保存自动格式化等配置终端
  • 换硬币问题

    编写程序实现用一元人民币换成一分 xff0c 两分 xff0c 五分的硬币共50枚 三重循环 include lt stdio h gt int main int x y z x y z 分别表示一分 两分 五分的个数 for x 61 0
  • 最新ubuntu22.04 下列软件包有未满足的依赖关系 解决方案--------------------------------------------------记因为配环境而耽误的一天

    今天真的崩溃一整天了 xff0c 一直一直都在找错一直一直都在找解决方案 xff0c 我发现VM真的超多超多BUG的 xff0c 感兴趣的话可以跟我聊聊 当然这篇讲的主要不是这些BUG xff0c 而是依赖关系 如果你出现类似的情况 xff
  • python获取当前执行py文件的绝对路径

    python获取当前执行py文件的绝对路径 python3 home appuser test py span class token comment 获取当前执行py文件的绝对路径 span py file path span class
  • 【iOS】NSAttributedString 相关

    1 富文本的相关属性字段 NSAttributedString Key xff08 1 xff09 paragraphStyle span class token keyword let span paraStyle span class

随机推荐

  • python奇技淫巧:命令行输出漂亮的表格

    前言 最近想着用 Python写一个命令行的管理各种资源的信息的管理工具 xff0c 比如阿里云的ECS等信息 xff0c 基本的功能就是同步阿里云的资源的信息到数据库 xff0c 然后可以使用命令行查询 展现信息在命令行中的 xff0c
  • Android_基础_String资源带参数

    转载自 https www cnblogs com leelugen p 6685905 html Android 基础 String资源带参数 在android 开发 xff0c 我们通常会用string xml资源去设置textview
  • es6 — class 类,原型,原型链

    文章目录 1 意义2 语法1 由来2 constructor 3 类实例3 1 使用new 调用3 2类的继承 4 新写法5 取值函数 getter 存值函数 setter 2 原型以及原型链1 原型2 原型链3 instanceof 1
  • SQLServer注释快捷键

    SQLServer中的批量注释 批量注释批量取消注释 批量注释 Ctrl 43 K C 按住Ctrl键不放 然后依次按下K和C 批量取消注释 Ctrl 43 K U 按住Ctrl键不放 然后依次按下K和U
  • 【面试宝典】软件测试工程师2021烫手精华版(第一章测试理论篇)

    前言 xff1a 翻了很多论坛博客关于面试的文章 xff0c 很多都是不完整的 xff0c 还都是比较常见规规矩矩的 xff0c 那大家刷过的基本都不拿出来了 xff0c 都是一些大家平时见得不多 xff0c 但是面试官很看中的一些题 第一
  • uniapp package.json和mainfest.json,如何区分环境变量

    uniapp在hbuilder中 xff0c 导航的运行就是development xff0c 发行就是production package json 如果是往服务器上发布版本 xff0c 则是打包成zip在服务器上解压 xff0c 但注意
  • VSCode扩展时出错XHRfaile问题解决

    问题 VScode扩展插件链接网络失败XHR faile错误 解决办法 1 第一步 xff1a 文件 gt 首选项 gt 设置 gt 如下图 xff1a 2 第二步 xff1a 用户 gt 应用程序 gt 代理服务器 gt 如下图操作 xf
  • HDFS的启动流程和HA

    HDFS的启动流程 当 NameNode 启动时HDFS首先将Fsimage读入内存对元数据进行恢复 xff0c 然后再读edits文件中的更新操作在恢复后的元数据上进行执行 xff0c 使得此时的NameNode中保存的是停止前的最新状态
  • 『XXG笔记』Github pages 自定义域名

    x1f44b 本文章为我 XXG 原创 xff0c 由于个人能力有限 xff0c 此笔记可能会错漏 过时 或需要补充 x1f4d6 笔记文章由于多平台发布 xff0c 为了修改方便 xff0c 可以参观我的博客 xff1a https xx
  • 第十八篇,Simulink with Git

    一 综述 本篇以MATLAB R2021b为基础讲解如何对Simulink模型做Git管理 xff0c mdl与slx均可 Git并非只能对手写代码做版本管理 xff0c 它的应用十分广泛 xff0c 囊括了各种使用编程语言编写的代码 脚本
  • 第十九篇,解析法求解五阶多项式

    x0为初始约束 xff0c 时间为0 xff1b x1为结束约束 xff0c 时间为t coef 为求解结果 xff0c 定义x 61 at 5 43 bt 4 43 ct 3 43 dt 2 43 et 43 f xff0c 则coef
  • 第二十篇,Simulink使用痛点记录

    在工作实践中发现了MATLAB amp amp Simulink一些虽不致项目失败但的确很不方便的点 xff0c 记录下来以备持续研究 xff0c 并做分享 xff1b 都是个人认为比较基础的能力或者容易做到的特性 xff0c MATLAB
  • 第七篇(下),MPC工程化总结

    目录 一 引言 二 MPC的理解与实现 2 1 模型设计与实现 2 2 MPC工程实现步骤 三 参考资料 3 1 基础理论 3 2 Refer to Apollo 3 3 其它实例参考 3 4 MATLAB中的MPC 四 demo代码 一
  • es6 -- 解构赋值

    文章目录 1 数组的解构赋值 xff0c 按次序排列 xff0c 位置决定2 对象的解构赋值 xff0c 没有次序 xff0c 变量与属性同名即可取值 默认undefined3 字符串的解构赋值4 数值和布尔值的结构赋值5 函数结构赋值 被
  • 第二十一篇,常用Git操作记录

    一 拉取远程分支 拉取远程名叫dev的分支 git fetch origin dev 执行后本地git branch并不能看到dev git checkout dev 可以看到dev了 xff0c 在dev上开发 二 本地新建分支推送到远程
  • 第二十二篇,C++面经之问答(一)

    目录 一 传引用有没有拷贝 二 引用和指针的区别 三 构造 析构函数中可不可以调用虚函数 四 怎样区分继承和组合 五 多态的实现原理 虚表虚指针 六 用过哪些设计模式 6 1状态模式 6 2享元模式 6 3单例模式 6 4工厂模式 6 5观
  • 第二十三篇,C++面经之问答(二)

    目录 一 lambda表达式的应用场景 二 lambda表达式传引用有什么坑 三 C 43 43 为什么引入线程的语言级支持 四 如何优雅地关闭一个阻塞中的线程 五 线程不做join 或detach 会有什么问题 六 多线程同步 xff0c
  • 第二十四篇,C++面经之问答(三)

    目录 一 TCP UDP的区别 应用场景 二 UDP里client server使用的过程 三 TCP端口复用问题 四 TCP三次握手 五 TCP四次挥手 六 Qt信号槽的连接方式 七 一个信号连接多个槽时 xff0c 槽函数的调用顺序 八
  • 第二十五篇,C++面经之问答(四)

    目录 一 std string是深拷贝还是浅拷贝 xff0c 深拷贝与浅拷贝的区别 二 string vector等容器中 xff0c size和capacity的区别 三 vector和list的区别 map和set的区别 四 STL中的
  • 第二十六篇,C++面经之问答(五)

    一 new delete和malloc free的区别 new delete是C 43 43 的关键字 操作符 xff0c malloc free是C的函数 xff0c 需引入 lt stdlib h gt new会调用构造函数会初始化并返