2024最新大厂C++校招面试真题合集,大厂面试百日冲刺 bay14

腾讯校招

(回答仅供参考)

编译好的静态C++可执行文件,是怎么执行起来的?

  1. 加载:操作系统(OS)加载可执行文件到内存中。这包括读取文件的元数据(比如程序入口点)和将代码及数据段映射到进程的地址空间。
  2. 链接:对于静态链接的可执行文件,所有所需的库函数在编译期间已经被包含进文件中。如果存在动态链接库(DLL或so文件),操作系统会在这一步解析并加载这些库。
  3. 初始化:执行全局对象的构造和初始化代码段(如C++全局构造函数)。
  4. 执行:跳转到程序的入口点(main函数)开始执行程序代码。
  5. 终止:程序执行结束(main函数返回),进行清理工作,比如执行全局对象的析构函数。然后,操作系统回收程序使用的资源,并结束进程。

——————————————————————————————————

STL map的底层实现是啥?

STL map 的底层实现是一个平衡二叉搜索树,具体来说通常是一个红黑树。这种数据结构能够保持元素有序,并且在插入、删除和查找操作上提供对数时间复杂度的性能。

——————————————————————————————————

红黑树有什么特点?

红黑树的特点包括:

  1. 节点颜色:每个节点被染成红色或黑色。
  2. 根节点规则:根节点总是黑色的。
  3. 红节点规则:红色节点的两个子节点都是黑色的(即不允许连续的红节点)。
  4. 完美黑色平衡:从任一节点到其每个叶子节点的所有路径上的黑色节点数量相同。
  5. 新节点规则:新插入的节点为红色。
  6. 调整和旋转:通过旋转和重新着色来维持红黑树的平衡性。

——————————————————————————————————

有了解过为什么要区分红色节点和黑色节点吗?

红黑树区分红色节点和黑色节点的原因是为了维护树的平衡,从而提高树操作的效率。红黑树的设计目标是一种自平衡的二叉搜索树,它通过将节点着色并且对树进行旋转和颜色变换来保持树的平衡。

——————————————————————————————————

红黑树和AVL树主要区别是啥,他们在查询效率,插入效率上有区别吗?

红黑树和AVL树主要的区别在于平衡条件和节点的旋转次数:

  1. 平衡条件:红黑树通过红色和黑色节点来实现大体平衡,而AVL树则保证树的每个节点的左右子树高度差最多为1(严格平衡)。
  2. 旋转次数:AVL树在插入和删除节点后可能需要更多的旋转来恢复平衡,因为它保持了更严格的平衡条件。相比之下,红黑树需要的旋转次数较少。

在性能方面:

  • 查询效率:由于AVL树是高度平衡的,所以在查询效率上要比红黑树略高,尤其是在查找操作远多于插入和删除的情况下。
  • 插入和删除效率:红黑树在插入和删除操作上通常比AVL树更高效,因为它的旋转次数少,从而减少了调整树的成本。

——————————————————————————————————

进程和程序有什么区别?

程序是一组指令的集合,存储在磁盘上,包含执行特定任务所需的代码。进程则是程序的一个运行实例,它在操作系统中占有内存空间和其他资源,有自己的执行状态和系统资源。

——————————————————————————————————

C++里浅拷贝和深拷贝有啥区别?

浅拷贝仅复制对象的各个值及其成员变量的值,如果成员变量包括指针,只复制指针的值而不复制指针指向的数据。这意味着原始对象和拷贝对象的指针成员将指向同一块内存地址。

深拷贝不仅复制对象的各个值及其成员变量的值,还会在堆上为所有指针成员分配新的内存,并复制指针指向的数据到新分配的内存中。

——————————————————————————————————

计算机存储体系有了解过吗,有哪些层级,每个模块的速度?

  1. 寄存器:位于处理器内部,提供最快的数据访问速度,存储容量非常有限。
  2. 缓存:同样位于处理器附近,分为L1、L2、(有时候还有)L3级,L1最快但容量最小,L3相对较慢但容量较大。
  3. 主存:存储容量较大,速度快,但不如寄存器和缓存,断电后数据会丢失。
  4. 辅助存储:包括硬盘驱动器、固态驱动器等,容量大速度慢于RAM,能持久存储数据。

——————————————————————————————————

当操作系统去执行你的程序时,在寄存器层面的流程是怎么样的,会和哪些存储去做交互?

当操作系统执行程序时,寄存器层面的流程大致如下,并会与以下存储进行交互:

  1. 指令寄存器:存储即将执行的指令。操作系统从主存中将指令加载到指令寄存器中。
  2. 程序计数器:存储下一条指令的地址。指令执行完毕后,程序计数器更新为下一条指令的地址。
  3. 数据寄存器:暂存指令执行过程中需要读写的数据。这些数据可能来自于缓存或主存,取决于数据的位置和缓存机制。
  4. 地址寄存器:存储内存地址,指明数据寄存器中的数据在主存中的位置。
  5. 累加器:用于存储操作结果,如算术和逻辑运算的中间或最终结果。

——————————————————————————————————

CPU分支预测了解过吗?

CPU分支预测是一种用于减少处理器中分支指令延迟的技术。在现代处理器中,指令通常是预先取出和解码的,这个过程称为指令流水线。当遇到如if-else或循环等分支指令时,处理器需要决定接下来执行哪条指令路径。分支预测就是处理器尝试提前猜测这些决策结果,以避免等待实际比较或计算结果而造成的停滞。

——————————————————————————————————

Linux内核的进程管理和内存管理有了解过吗?

Linux内核通过进程控制块,也称为任务结构体task_struct,来管理进程。每个进程在内核中都有一个对应的task_struct结构,其中包含进程ID、进程状态、运行统计、进程的地址空间等信息。Linux调度器负责进程的调度,根据进程的优先级和策略来决定哪个进程获得CPU时间。

Linux内核采用虚拟内存管理机制,通过页表将虚拟地址空间映射到物理内存地址。它支持分页和交换,允许内存的动态分配和回收。内核通过页全局目录、页上级目录、页中间目录和页表这四级页表机制来管理内存映射。此外,内核还实现了内存分配算法,如伙伴系统和slab分配器,用于高效的内存分配与回收。

——————————————————————————————————

Linux的进程调度基本算法?

  1. 完全公平调度器(CFS): CFS是Linux默认的调度算法。它基于时间片轮转的概念,但不同之处在于它为每个进程分配运行时间,以确保所有进程都能公平地获得CPU时间。CFS使用虚拟运行时间来跟踪每个进程的CPU使用情况,确保长时间未运行的进程能获得更多的CPU时间。
  2. 实时调度策略(RT): Linux支持两种实时调度策略,即FIFO(先进先出)和Round-Robin(轮转)。这些策略主要用于需要高响应时间的实时任务。在FIFO中,首个进入队列的进程将继续运行,直到完成或显式释放CPU。在Round-Robin中,实时进程以固定的时间片轮流运行,确保所有高优先级的实时进程获得公平的CPU时间。

——————————————————————————————————

CFS算法的缺点是什么

  1. 任务饥饿: 尽管CFS旨在防止饥饿,但在高负载下,低优先级的任务可能仍会遇到服务延迟。
  2. 复杂度: CFS的数据结构和时间管理相对复杂,可能导致管理开销。
  3. 实时性能: CFS更适用于普通任务,对于高实时性要求的任务,可能不如专门的实时调度器表现良好。
  4. 负载敏感性: 在大量并发进程的情况下,CFS可能会因为过度切换而导致性能下降。

——————————————————————————————————

怎么理解数据库的索引

数据库索引是数据库管理系统中用于加快数据检索速度的数据结构。它类似于书籍的目录,能够帮助数据库快速定位所需的记录,而不需要扫描整个表。

索引的原理:

  1. 数据结构: 索引通常使用树形数据结构如B树或其变种B+树来存储,利用这些数据结构的高效查找和插入特性来维护有序的数据,并允许快速的搜索、插入、删除和更新操作。
  2. 键值查找: 索引存储着键值对,键通常是表中的某个列(或多个列的组合),称为索引键,与其对应的值就是记录在数据表中的位置。
  3. 效率提升: 当执行查询时,数据库会先在索引中查找对应的键,快速定位数据位置,然后直接访问数据表中的记录,从而显著降低数据检索时间。

——————————————————————————————————

MySQL存储引擎InnoDB索引是怎么实现的

MySQL的InnoDB存储引擎通过B+树数据结构实现索引。主要有两种类型的索引:主键索引和辅助索引(也称为二级索引)。

  1. 主键索引:是一种特殊的唯一索引,不允许有重复的值。每个InnoDB表都有一个主键索引,用于快速查找表中的数据。在B+树的叶节点中直接存储了行的全部数据。
  2. 辅助索引(二级索引):可以基于表中非主键列创建辅助索引。辅助索引的叶节点存储的是对应行的主键值,而不是行的全部数据。当通过辅助索引查找数据时,InnoDB先使用辅助索引找到对应的主键值,然后再通过主键值在主键索引中查找到完整的行数据。

——————————————————————————————————

B树和B+树有什么区别

B树和B+树的主要区别包括:

  1. 数据存储位置:B树可以在所有节点上存储数据,而B+树的数据只存储在叶子节点上。
  2. 节点结构:B树的节点中存储了键和数据,而B+树的内部节点仅存储键,叶子节点存储键和数据。
  3. 遍历方式:B+树的叶子节点通过指针连接,形成了一个有序链表,这使得B+树能够更高效地进行范围查询。
  4. 空间利用率:由于B+树的内部节点不包含数据信息,同样大小的节点可以存储更多的键,使得B+树的高度更低,检索效率更高。

——————————————————————————————————

C++读写文件是怎么操作的

在C++中,读写文件主要通过<fstream>库中的ifstream(用于读取文件)、ofstream(用于写入文件)和fstream(用于同时读写文件)类来操作。

——————————————————————————————————

收集整理了一份2024年最新C++开发学习资料,既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C++开发知识点,真正体系化!
包含大厂面经、学习笔记、实战项目、大纲路线、讲解视频 领取 君羊739729163 或者
https://docs.qq.com/doc/DR2N4d25LRG1leU9Q
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值