C++高频面试题汇总

C++高频面试题汇总

一、C++基础知识

1.指针与引用区别

指针可以为空、可重复赋值、占用内存空间;

引用必须初始化、不能修改指向、不占额外内存、更安全

2.const 三种用法

const int*: 指向的值不可修改,指针可修改

int* const: 指针地址不可修改,值可以修改

const int* const:值和地址都不能修改

3.虚函数与多态

虚函数靠虚函数表vtable实现多态,父类指针指向子类对象,运行时调用子类方法。

菱形继承会有二义性,用虚继承解决

4.智能指针

shared_ptr:引用计数管理,多线程下计数安全、对象不安全

weak_ptr: 解决循环引用问题,不增加引用计数,配合shared_ptr 使用

unique_ptr:是独占所有权的智能指针。同一时间只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也会被自动删除

5.C++11重点

右值引用:&&表示,只能绑定到右值(包括将亡值)

移动语义:std::move,允许资源从一个对象转移到另一对象,避免深拷贝。

Lambda匿名函数

基本语法
capture -> return_type {

// 函数体

}

捕获列表

\]:不捕获任何变量 \[=\]:按值捕获所有变量 \[\&\]:按引用捕获所有变量 \[x, \&y\]:按值捕获x,按引用捕获y \[=, \&x\]:按值捕获所有变量,但x按引用捕获 \[\&, x\]:按引用捕获所有变量,但x按值捕获 完美转发:完美转发允许函数模板将其参数原封不动地转发给另一个函数,保持参数的值类别(左值/右值)和常量性。std::forward是一个条件转换,当传入的参数是左值时,它返回左值引用;当传入的参数是右值时,它返回右值引用。这样就可以保持参数原有的值类别。 ##### 6.auto与decltype区别 * 1. 推导目标: * auto: 从初始化器推导变量类型 * decltype: 从表达式推导类型 * 2. 引用/const处理: * auto: 默认忽略顶层const和引用 * decltype: 完全保留类型信息 * 3. 表达式求值: * auto: 会计算初始化表达式的值 * decltype: 不计算表达式的值 * 4. 数组处理: * auto: 数组退化为指针 * decltype: 保持数组类型 * constexpr 编译期间计算 * 结构化绑定、std::optional、std::variant ##### 7. RAII原则 * 资源获取即初始化,利用对象生命周期管理资源 * 构造函数获取资源,析构函数释放资源 ##### 8.函数重载、重写、隐藏的区别 * 重载(overload):统一作用域,函数名相同,参数不同 * 重写(override):派生类重写基类虚函数 * 隐藏(overwrite):派生类函数屏蔽基类同名函数。 ##### 9.虚函数与多态机制 * 虚函数表(vtable):每个虚函数的类都有虚函数表 * 虚指针(Vptr):每个对象都又指向vtable的指针 * 动态绑定:运行时根据对象实际类型确定调用的函数 ### 二、操作系统 #### 1.进程线程区别 进程资源独立、开销大、隔离性强 线程共享进程资源、开销小、切换快,同进程内线程通信简单 #### 2.进程间通信(IPC) 主要方式: * 管道(Pipe):单向,父子进程间 * 命名管道(FIFO):无亲缘关系进程间 * 消息队列:结构化数据,异步通信 * 共享内存:最快的方式,需要同步机制 * 信号量:同步工具,控制资源访问 * 套接字(socket):网络通信,跨机器 #### 3.线程同步机制 同步原语: * 互斥锁(Mutex) * 信号量 (Sempaphore) * 条件变量(Condition Variable) * 读写锁(Read-Write Lock) * 屏障(Barrier) #### 4.死锁必要条件 * 互斥:资源一次只能被一个进程使用 * 占有并等待:进程持有资源并等待其他资源 * 不可抢占:资源只能由持有进程释放 * 循环等待:存在进程资源的循环等待链 #### 5.死锁处理策略 * 预防:破坏死锁形成的必要条件 * 避免:银行家算法 * 检测:资源分配图 * 忽略:鸵鸟算法 #### 6.用户态和内核态的区别? * 用户态:运行用户程序,权限受限,不能直接访问硬件 * 内核态:运行操作系统内核,有完全的系统权限 * 切换方式:系统调用、中断、异常 #### 7.什么是系统调用?举例说明 系统调用是用户程序请求操作系统服务的接口。 ```cpp // 例如:文件读写 int fd = open("file.txt", O_RDONLY); // 系统调用 read(fd, buffer, size); // 系统调用 close(fd); // 系统调用 ``` #### 8.进程和线程的上下文切换有什么区别? * 进程切换:切换地址空间、寄存器、栈、文件描述符等,开销大。 * 线程切换:同一进程内切换,只需要切换寄存器、栈等,开销小。 #### 9.什么是虚拟内存?有什么好处? 虚拟内存将物理内存和磁盘结合,提供更大的地址空间。 好处: 1.程序可以使用比物理内存更大的地址空间 2.内存隔离,提高安全性 3.简化内存管理 4.支持内存共享 ### 三、网络编程 #### 1. OSI 七层模型 vs TCP/IP四层模型 OSI 七层模型: * 应用层:应用程序间通信,代表协议:HTTP、FTP、SMTP、DNS * 表示层:数据格式转换、加密。主要协议:SSL/TLS、JPEG、MPEG * 会话层:建立、管理、终止会话。主要协议:NetBIOS、RPC。 * 传输层:端到端通信,流量控制。主要协议:TCP、UDP * 网络层:路由选择,IP寻址。 主要协议:IP、ICMP、ARP * 数据链路层:帧传输、物理寻址。主要协议:Ethernet、PPP * 物理层:比特率传输。主要协议:802.11 、RJ45 TCP/IP四层模型: * 应用层 * 传输层 * 网络层 * 网络接口层 #### 2. TCP vs UDP TCP:面向连接、可靠传输、流量控制、拥塞控制,头部大小20\~60字节,适合应用场景:文件传输、Web、邮件。 UDP:无连接、不可靠、简单高效,头部大小8字节,适合应用场景:视频流、DNS、游戏。 #### 3. TCP 三次握手和四次挥手 ###### 三次握手(建立连接): * 客户端-\>SYN=1,seq=x -\>服务器 * 客户端\<- SYN=1,ACK=1, seq=y,ack=x+1\<-服务器 * 客户端-\>ACK=1,seq=x+1,ack=y+1-\>服务器 ###### 四次挥手(关闭连接): 客户端-\>FIN=1,seq=u-\>服务器 客户端\<-ACK=1,seq=v,ack=u+1 \<-服务端 客户端\<-FIN=1,ACK=1,seq=w,ack=u+1\<-服务端 客户端-\>ACK=1,seq=u+1,ack=w+1-\>服务端 ##### 为什么是三次握手? * 防止已失效得连接请求报文突然传送到服务器 * 双方确认彼此得收发能力正常 ##### 为什么是四次挥手? * TCP是全双工得,每个方向需要单独关闭 * TIME_WAIT状态作用(等待2MSL) ##### TIME_WAIT状态作用? * 确保最后一个ACK能被对方收到 * 让旧连接的数据包在网络中消失 #### 4. epoll、select、poll原理 \& LT/ET IO多路复用:允许单个进程/线程同时监控多个文件描述符(通常是套接字),当其中任何一个描述符就绪时,程序就可以进行相应的读写操作。 select:轮询所有文件描述符,通常单进程有限制,最大1024个 poll:改进的轮询,无数量限制。 epoll:回调机制,只处理就绪的fd。 水平触发(LT):只要描述处于就绪状态,每次调用epoll_wait都会返回该事件。是默认方式。编程简单,但效率较低,因为每次都需要处理。 垂直触发(ET):只有当描述符状态发生改变时,epoll_wait才返回该事件。编码复杂,需要一次将数据全部读完,否则可能会丢失事件,但效率更高。 #### 5.HTTP协议 HTTP(超文本传输协议):应用层协议,基于tcp,默认端口80;HTTPS端口:443 HTTP/1.0 1.1 2.0 3.0区别 HTTP1.0:短连接,一次请求一次享应就断开,无持久连接。 HTTP1.1:长连接默认开启、管线化、虚拟主机、断点续传、缓存强化。 HTTP2.0: 二进制帧,多路复用、头部压缩、服务器推送,单TCP连接多流。 HTTP3.0:基于QUIC/UDP,解决对头阻塞,握手更快,弱网更好。 **请求结构\&响应结构** 请求组成:请求行+请求头+请求体 -请求行:请求方法+URL协议版本 响应组成:状态行+响应头+响应体 ```c //HTTP请求 GET /index.html HTTP/1.1\r\n Host: www.example.com\r\n User-Agent: Mozilla/5.0\r\n Accept: text/html\r\n \r\n //HTTP 响应 HTTP/1.1 200 OK\r\n Content-Type: text/html\r\n Content-Length: 1234\r\n \r\n ... ``` **请求方法** * GET:查,参数放在URL,无请求体,可缓存、不安全、长度限制。 * POST:增,参数放请求体,不默认缓存,无长度限制 * PUT:全量修改 * PATCH:局部修改 * DELETE:删除 * HEAD:只返回响应头,无响应体 * OPTIONS:查看并服务器支持的请求方法、跨域预检 * CONNECT:隧道代理 * TRACE:回显显示 **HTTP状态码** * 1xx:信息性 * 2xx:成功 * 3xx:重定向 * 4xx:客户端错误 * 5xx:服务端错误 #### 6.HTTPS与SSL/TLS HTTPS=HTTP+SSL/TLS SSL/TLS握手过程: * 1.Client Hello:客户端支持的协议版本、加密套件、随机数 * 2.Server Hello:服务器选择的协议版本、加密套件、随机数 * 3.证书验证:服务器发送证书,客户端验证 * 4.密钥交换:生成会话密钥 * 5.加密通信:使用会话密钥加密数据 #### 7.TCP粘包和拆包问题 ##### 原因: * TCP是字节流协议,没有消息边界 * 发送方多次发送的数据可能被合并(粘包) * 一次发送的数据可能被拆分(拆包) ##### 解决方案: * 1.固定长度:每个消息固定长度 * 2.分隔符:使用特殊字符座位消息边界 * 3.长度字段:消息头包含消息长度 * 4.TLV格式:TYPE-Lengh-Value格式 #### 8.零拷贝技术 **传统文件传输**: * 磁盘-\>内核缓冲区-\>用户缓冲区-\>socket缓冲区-\>网卡 * 4次拷贝、4次上下文切换 **零拷贝(sendfile)**: * 磁盘-\>内核缓冲区-\>网卡 * 2次拷贝、2次上下文切换 ### 四、音视频知识点 #### 1.解释容器格式和编码格式的区别? 容器格式:存储音视频数据的文件格式,如MP4、AVI、MKV 编码格式:压缩音视频数据的方式,如H.264、AAC #### 2.什么是GOP? GOP(Group of Pictures):一组连续的帧,包含一个I帧和多个P/B帧。 I帧是关键帧,独立编码 P帧参考前一帧 B帧参考前后帧 #### 3.如何提高编码速度? * 使用更快的preset: -preset ultrafast * 使用硬件加速:-c:v h264_nvenc * 降低分辨率: -s 1280\*720 * 降低帧率:-r 30 #### 4.ffmpeg解码的基本流程? * 1.打开输入文件 * 2.获取流信息 * 3.查找解码器 * 4.创建解码上下文 * 5.打开解码器 * 6.读取数据包 * 7.发送数据包到解码器 * 8.接收解码后的帧 * 9 处理帧数据 * 10.重复6-9直到结束 * 11.释放资源 #### 5.音频3A算法及混音原理 ##### 5.1 3A算法概述 3A算法是音频信号处理中的三大核心技术: * AEC(Acousic Echo Cancellation,回声消除) * ANS(Automatic Noise Suppression,自动噪声抑制) * AGC(Automatic Gain Control,自动增益控制) ##### 5.2 AEC(回声消除)原理 回声消除旨在消除扬声器播放的声音被麦克风再次采集产生的回声,确保通话清晰。 * 回声产生机制 ```cpp 近端说话者->麦克风->扬声器->房间反射->麦克风->回声 远端说话者-> 扬声器->房间反射->麦克风->回声 ``` * 核心机制: * 1.自适应滤波:系统持续分析从扬声器到麦克风的声学路径(即"回声路径"),并建立一个数字滤波器来模拟该路径。当远端声音从扬声器播放时,滤波器会生成一个与之匹配的"回声估计信号"。 * 2.回声抵消:从麦克风采集的混合信号(近端人声+环境声+回声)中,实时减去这个"回声估计信号",从而消除回声成分。 * 3.双讲检测与非线性处理:这是一个关键挑战。当近端和远端同时说话(双讲)时,系统需要准确区分回声与近端人声。 * 双讲检测:通过比较麦克风信号与回声估计信号的能量、相关性等,判断当前是否处于双讲状态。在双讲期间,系统会谨慎调整或暂停滤波器更新,防止将近端人声误当作回声进行消除 * 非线性处理:自适应滤波器无法完全消除所有回声(尤其时非线性失真部分)。因此,左后会通过一个非线性处理器(如谱减法)对残余的微量回声进行一步抑制。 简单比喻:就像有一个"预言家"(自适应滤波器)在实时预测即将到来的回声时什么样子,然后提前准备一个完全相反的信号将其抵消。 ##### 5.3 ANS(自动噪声抑制)原理 噪声抑制的目标是降低或消除背景环境噪声(如风扇声、键盘声、街道嘈杂声),同时尽可能保留清晰的人声。 主要方法: * 1.频域分析:将音频信号从时域转换到频域(常用短时傅里叶变换),分析不同频率成分的能量。 * 2.噪声估计: 系统判断为"无人说话"的静音段,学习并建立背景噪声的"声纹"模型(即噪声谱),并持续跟踪其缓慢变化。 * 3. 增益计算与抑制:对于每一帧信号,系统在频域上比较当前信号与估计的噪声谱。 * 谱减法:直接从信号谱中减去估计的噪声频谱。为防止音乐噪声,会设置一个"谱底限"。 * 维纳滤波法:基于信号与噪声的功率比(信噪比)计算一个最优增益滤波器,信噪比高的频段(可能是语音)增益高,信噪比低的频段(可能是噪声)增益被压低。 * 4.时域重建:将处理后的频域信号转换回时域,得到降噪后的音频。 **进阶技术**:现代ANS通常采用基于深度学习的模型(如循环神经网络RNN),直接学习从带噪语音到干净语音的复杂映射,在非平稳噪声(如突然的关门声、他人谈话)抑制方面表现更优。 ##### 5.4 AGC(自动增益控制原理) 自动增益控制用于动态调整音频信号的幅度,使输出音量稳定在一个舒适、一致的范围内,避免声音忽大忽小。 工作流程: * 1.电平检测:实时计算输入信号的幅度或响度(如RMS值、峰值)。 * 2.增益计算:将检测到的电平与一个预设的"目标电平"进行比较。如果输入电平过低,则计算一个大于1的增益进行提升;如果过高,则计算一个小于1的增益进行衰减。 * 3.平滑应用:计算出的增益不会立即全部施加,而是通过"启动时间"和"释放时间"两个参数进行平滑过渡。 * 启动时间:当信号突然变大时,增益快速降低以防止削波失真 * 释放时间:当信号突然变小时,增益缓慢恢复,避免背景噪声被不适当地提升而产生"呼吸效应"。 * 4. 限幅保护:最终输出前,会经过一个限幅器,严格防止信号超过最大允许电平(如:0 dBFS),避免数字削波。 高级形态: * 多段AGC:将音频频谱分为多个频段(如低、中、高),每个频段独立进行增益控制。这可以解决"整体音量合适但某些频率特别刺耳或沉闷"的问题, * 压缩器/限制器:可视为AGC的变种,拥有更精细的阈值、压缩比、拐点等参数,常用于音乐制作和广播,在控制动态范围的同时保留更多的音色细节。 ##### 5.5 混音原理 混音时将多路独立的音频信号合并为一路或少数几路输出信号的过程。 ###### 1.基础混音 * 线性叠加:最直接的方法时将所有输入信号的样本按时间点直接相加。公式为:输出\[t\] = 输入1\[t\]+输入2\[t\]+...+输入N\[t

  • 防溢出与归一化:直接相加可能导致样本值超出设备可表示的最大范围(如+1.0),产生严重失真.解决方法包括:
  • 整体衰减:将所有输入信号乘以一个小于1的系数(如1/N)再相加。
  • 动态限制:实时检测求和结果,一旦超过阈值,立即按比例压缩。
  • 自动增益调节:根据活跃输入通道的数量和电平、动态调整混合权重,使总输出电平保持稳定。
2.智能混音

为了在多人通话或会议中获得更佳体验,混音策略更加智能。

  • 基于语音活动检测(VAD)的混音:系统首先判断每个输入通道当前是否包含有效语音。
    • 当仅有一人说话时,可将其信号以较高增益输出,获得最佳清晰度。
    • 当多人同时说话时,可采用"自动增益平衡"策略,自动衰减音量较大的说话者,提升音量较小的说话者,使得各方都能被听清,而不是简单叠加导致一片嘈杂。
  • 选择性输出:在一些高级会有系统中,可能只输出当前最活跃的1-2路语音,或由主持人手动选择输出的音源。
3.空间化混音(3D音频/立体声)

当输出为立体声或多声道时,混音还需要考虑声源的空间定位。

  • 声像调节:通过调整信号送入左、右声道的相对比例(增益)和微小延迟,可以控制声音在立体扬声器中的水平位置(左-中-右)
  • 距离模拟:通过模拟声音随距离的衰减(音量减小)和高频吸收(声音变闷),营造远近感。
  • 环境混响:为声音添加微弱的,模拟特定空间(如房间、大厅)的反射声,可以增强其空间感和融合度,使得多个声源听起来处于同一个声学环境中。
相关推荐
AbandonForce34 分钟前
哈希表(HashTable,散列表)个人理解
开发语言·数据结构·c++·散列表
样例过了就是过了1 小时前
LeetCode热题100 编辑距离
数据结构·c++·算法·leetcode·动态规划
z200509301 小时前
C++中位图和布隆过滤器的一些面试题
开发语言·c++
khalil10202 小时前
代码随想录算法训练营Day-46 动态规划13 | 647. 回文子串、516.最长回文子序列、动态规划总结
数据结构·c++·算法·leetcode·动态规划·回文子串·回文子序列
挨踢ren2 小时前
单例模式:C++实现与多线程安全
c++·设计模式
用户805533698032 小时前
现代Qt开发教程(新手篇)1.14——日志
c++·qt
Raink老师2 小时前
用100道题拿下你的算法面试(链表篇-4):合并 K 个有序链表
算法·链表·面试
风止何安啊2 小时前
手写 URL 解析器,面试官到底想考什么?
前端·javascript·面试
艾莉丝努力练剑3 小时前
【Linux网络】Linux 网络编程入门:TCP Socket 编程(下)
linux·运维·服务器·网络·c++·tcp/ip
宵时待雨3 小时前
linux笔记归纳4:进程概念
linux·运维·服务器·c++·笔记