【CPP面经】科大讯飞 腾讯后端开发面经分享
文章目录
- C++ 面试问题整理
- 基础问题简答
- 1. 内存对齐
- 2. `this` 指针
- 3. 在成员函数中删除 `this`
- 4. 引用占用内存吗?
- 5. C++ 越界访问场景
- 6. 进程通信方式
- 7. 无锁队列实现
- 8. `ping` 在哪一层?实现原理?
- 9. HTTPS 流程
- 10. GDB 使用及 CPU 高使用定位
- 11. 智能指针
- 12. 右值引用与移动语义
- 13. `coredump` 与 `minidump` 区别
- 14. 设计模式
- 扩展问题详解
- 0. 自我介绍 + 项目介绍 + 问题解决
- 1. 智能指针详解
- 2. STL 容器底层原理
- 3. B+ 树详解
- 4. 线程创建方式
- 5. DFS 和 BFS 过程
- `malloc` / `free` vs `new` / `delete`
- `shared_ptr` 线程安全吗?
- 内存对齐详解
- 右值引用 vs. 移动语义详解
- `this` 指针详解
- `delete this` 详解
- 引用占用内存详解
- 越界访问详解
- 无锁队列详解
- `ping` 详解
- HTTPS 流程详解
- 定位 `new` 详解
- 线程池优点
- TCP 三次握手与四次挥手
- 服务器使用守护进程
- InnoDB vs MyISAM
- 索引的作用
- 高精度加法
- 锁机制
- TCP 三次握手额外信息
- B+ 树详解
以下是整理后的 Markdown 格式内容,已根据你的需求从
<DOCUMENT> 中提取并重新组织,确保逻辑清晰、格式规范,适合直接复制到博客发布。内容涵盖了所有问题及其答案,并对部分复杂问题进行了扩展讲解。
C++ 面试问题整理
以下是常见的 C++ 面试问题及其答案,涵盖内存管理、并发、网络协议、数据库等多个方面,适合复习或面试准备。
基础问题简答
1. 内存对齐
- 作用:提高 CPU 访问效率,避免跨对齐边界访问导致性能下降或硬件错误。
- 实现:编译器通过插入填充字节,使数据按类型对齐(如
int按 4 字节对齐);可用#pragma pack(n)或alignas(n)控制。 - 示例:
struct A { char a; int b; short c; }; // sizeof(A) = 12,填充 3+2 字节
2. this 指针
- 作用:指向当前对象实例,用于访问成员变量和方法,支持链式调用。
- 实现:编译器隐式传递,成员函数接收
this作为隐藏参数(如void A::func(A* this))。 - 示例:
class A { int x; void set(int x) { this->x = x; } };
3. 在成员函数中删除 this
- 后果:释放对象内存,后续访问会导致未定义行为(如崩溃)。
- 注意:仅适用于动态分配对象,需立即返回避免继续使用。
- 示例:
class A { void destroy() { delete this; return; } };
4. 引用占用内存吗?
- 答案:通常不占额外内存(作为别名优化掉),但在类成员等场景可能占用指针大小(4/8 字节)。
- 示例:
int a = 10; int& ref = a; // ref 不占额外空间
5. C++ 越界访问场景
- 数组越界(如
arr[10]访问大小为 5 的数组)。 - 野指针或已释放内存访问。
- 容器操作(如
vector的operator[]未检查边界)。 - 示例:
int arr[5]; arr[10] = 1; // 未定义行为
6. 进程通信方式
- 管道(匿名/命名)、消息队列、共享内存、信号量、套接字、信号、mmap 文件映射、Unix 域套接字。
7. 无锁队列实现
- 方法:基于原子操作(如 CAS)管理头尾指针。
- 示例:
std::atomic<Node*> head; // 使用 CAS 更新
8. ping 在哪一层?实现原理?
- 层级:网络层(ICMP 协议)。
- 原理:发送 ICMP Echo 请求,接收 Echo 响应,计算 RTT 判断连通性。
9. HTTPS 流程
- 客户端发送
ClientHello(TLS 版本、加密套件)。 - 服务器返回
ServerHello和证书。 - 客户端验证证书,生成预主密钥并加密发送。
- 双方派生对称密钥,加密通信。
10. GDB 使用及 CPU 高使用定位
- 使用:
gdb attach <PID>,thread apply all bt查看堆栈。 - 定位:
top -H找高 CPU 线程,gdb分析热点代码。
11. 智能指针
shared_ptr:引用计数,共享所有权。unique_ptr:独占所有权,支持移动。weak_ptr:解决循环引用。
12. 右值引用与移动语义
- 右值引用(
&&):绑定临时对象。 - 移动语义:通过右值引用转移资源,避免深拷贝。
- 差异:右值引用是语法手段,移动语义是优化策略。
13. coredump 与 minidump 区别
coredump:完整内存转储,文件大。minidump:精简转储,仅关键信息。
14. 设计模式
- 单例:确保唯一实例。
- 工厂:封装对象创建。
- 观察者:事件通知。
- 策略:算法切换。
扩展问题详解
0. 自我介绍 + 项目介绍 + 问题解决
- 示例:我是某公司开发,参与过高并发服务器项目,遇到内存泄漏问题。用
valgrind定位,优化资源释放逻辑解决。
1. 智能指针详解
- 出现原因:避免裸指针的内存泄漏和悬空指针问题。
- 性能开销:
shared_ptr有引用计数开销(原子操作),unique_ptr无额外开销。 - 支持类型:任意类型(内置类型、类、指针等)。
2. STL 容器底层原理
vector:动态数组,连续内存,容量翻倍增长。list:双向链表,支持快速插入删除。map:红黑树,键值对有序存储。
3. B+ 树详解
- 结构:多叉树,叶子节点存储数据,非叶子节点存储索引。
- 特点:叶子节点双向链表(InnoDB),支持范围查询。
- 优势:减少 IO,提升查询效率。
4. 线程创建方式
std::thread:C++11 标准。pthread_create:POSIX 线程。- 示例:
std::thread t([]{ std::cout << "Thread\n"; });
5. DFS 和 BFS 过程
- DFS(深度优先搜索):递归或栈,深入一条路径。
- BFS(广度优先搜索):队列,按层遍历。
malloc / free vs new / delete
malloc/free:C 风格,仅分配/释放内存,不调用构造/析构。new/delete:C++ 风格,分配内存并调用构造/析构。- 示例:
int* p = new int(10); delete p;
shared_ptr 线程安全吗?
- 引用计数:线程安全(原子操作)。
- 对象访问:不安全,需外部加锁。
- 示例:
std::shared_ptr<int> sp = std::make_shared<int>(10);
内存对齐详解
- 作用:提高 CPU 访问效率,避免硬件错误。
- 实现:
- 默认对齐:按类型大小(如
int4 字节)。 - 控制:
#pragma pack(n)或alignas(n)。
- 默认对齐:按类型大小(如
- 示例:
#pragma pack(2) struct A { char a; int b; }; // sizeof(A) = 6
右值引用 vs. 移动语义详解
- 右值引用(
&&):绑定临时对象,允许修改。 - 移动语义:转移资源,避免拷贝。
- 示例:
std::string s1 = "Hello"; std::string s2 = std::move(s1); // s1 变空
this 指针详解
- 作用:访问当前对象,支持链式调用。
- 实现:隐式参数,编译器传递。
- 示例:
class A { A& set(int x) { this->x = x; return *this; } };
delete this 详解
- 后果:释放对象内存,后续访问未定义。
- 正确用法:动态对象,删除后立即返回。
- 示例:
class A { void destroy() { delete this; } };
引用占用内存详解
- 一般情况:不占内存(优化为别名)。
- 特殊情况:类成员引用占指针大小。
- 示例:
struct A { int& ref; A(int& r) : ref(r) {} };
越界访问详解
- 场景:数组越界、野指针、容器操作错误。
- 避免:边界检查,使用
at()。 - 示例:
std::vector<int> v{1, 2}; v.at(5); // 抛异常
无锁队列详解
- 实现:原子操作(如 CAS)管理指针。
- 示例:
std::atomic<Node*> head; // CAS 更新
ping 详解
- 层级:网络层(ICMP)。
- 原理:发送 Echo 请求,接收 Echo 响应。
- 示例:
ping 8.8.8.8
HTTPS 流程详解
- 步骤:
ClientHello:发送 TLS 参数。ServerHello:返回证书。- 密钥交换:生成对称密钥。
- 加密通信。
定位 new 详解
- 定义:在已有内存上构造对象。
- 用途:内存池、嵌入式系统。
- 示例:
char buf[sizeof(int)]; int* p = new (buf) int(42);
线程池优点
- 复用线程,减少创建销毁开销。
- 控制线程数,避免上下文切换。
- 任务队列提升吞吐量。
TCP 三次握手与四次挥手
- 三次握手:建立连接,交换 ISN、窗口大小。
- 四次挥手:确保数据传输完成,防止丢失。
服务器使用守护进程
- 优点:后台运行,独立环境,持续服务。
- 示例:Nginx、MySQL。
InnoDB vs MyISAM
- InnoDB:事务支持,行级锁,崩溃恢复。
- MyISAM:读性能高,表级锁,无事务。
索引的作用
- 提高查询速度,加速排序和 JOIN。
- 示例:
CREATE INDEX idx ON table(col);
高精度加法
- 实现:字符串模拟,处理进位。
- 应对非法输入:校验数字格式,去除前导零。
- 示例:
string add(string a, string b);
锁机制
- 类型:互斥锁、读写锁、自旋锁。
- 示例:
std::mutex mtx; std::lock_guard lock(mtx);
TCP 三次握手额外信息
- 交换 ISN、窗口大小、MSS、时间戳等。
- 示例:
SYN(seq=x) -> SYN-ACK(seq=y, ack=x+1)
B+ 树详解
- 叶子节点:InnoDB 中双向链表,页内单向。
- 链表类型:
- 单向:节省空间。
- 双向:支持范围查询。
- 循环:轮询调度。
以上内容已整理为 Markdown 格式,直接复制即可发布到博客。每个问题都有简洁回答或详细讲解,涵盖代码示例和关键点,适合技术分享或面试复习。
相关文章:
【CPP面经】科大讯飞 腾讯后端开发面经分享
文章目录 C 面试问题整理基础问题简答1. 内存对齐2. this 指针3. 在成员函数中删除 this4. 引用占用内存吗?5. C 越界访问场景6. 进程通信方式7. 无锁队列实现8. ping 在哪一层?实现原理?9. HTTPS 流程10. GDB 使用及 CPU 高使用定位11. 智能…...
el-card 结合 el-descriptions 作为信息展示
记录下el-card 组合 el-descriptions 实现动态展示信息 文章结构 实现效果1. el-descriptions 组件使用1.1 结合v-for实现列表渲染1.2 解析 2. 自定义 el-descriptions 样式2.1 修改背景色、字体颜色2.2 调整字体大小2.3 解析 3. el-card 结合 el-descriptions 作为信息展示3.…...
GaussDB自带诊断工具实战指南
一、引言 GaussDB是一种分布式的关系型数据库。在数据库运维中,快速定位性能瓶颈、诊断故障是保障业务连续性的关键。GaussDB内置了多种诊断工具,结合日志分析、执行计划解析和实时监控功能,帮助开发者与运维人员高效解决问题。本文深入讲解…...
LeetCode 链表章节
简单 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2…...
SSL证书和HTTPS:全面解析它们的功能与重要性
每当我们在互联网上输入个人信息、进行在线交易时,背后是否有一个安全的保障?这时,SSL证书和HTTPS便扮演了至关重要的角色。本文将全面分析SSL证书和HTTPS的含义、功能、重要性以及它们在网络安全中的作用。 一、SSL证书的定义与基本概念 S…...
正交投影与内积空间:机器学习的几何基础
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 🔍 1. 内积空间的…...
Qt中txt文件输出为PDF格式
main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…...
《HelloGitHub》第 107 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…...
Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)
在 LangChain解锁LLM大语言模型的结构化输出能力:调用 with_structured_output() 方法 这篇博客中,我们了解了格式化LLM输出内容的必要性以及如何通过调用langchain框架中提供的 with_structured_output() 方法对LLM输出进行格式化(三种可选方…...
AI数据分析:deepseek生成SQL
在当今数据驱动的时代,数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展,AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行自动补全SQL 查询语句。 我们都知道,SQL 查询语…...
力扣-动态规划-115 不同子序列
思路 dp数组定义:0_i-1的字符串中有0_j-1的字符串有dp[i][j]个递推公式: if(s[i-1] t[j-1]){dp[i][j] dp[i-1][j-1] dp[i-1][j]; }else{dp[i][j] dp[i-1][j]; } 在该元素相同时,有两种可能1:使用该元素,所以0_i-2…...
Qt C++ 开发 动态上下页按钮实现
项目开发,想实现动态的显示按钮,考虑使用QStackedWidget做两个页面去切换。 首先,我们使用Qt ui 画出两个QStackedWidget的两个页面 要实现切换,我们只需要调用stackedWidget->setCurrentIndex(index)就行。 那么如何自动调…...
数据结构第五节:排序
1.常见的排序算法 插入排序:直接插入排序、希尔排序 选择排序:直接选择排序、堆排序 交换排序:冒泡排序、快速排序 归并排序:归并排序 排序的接口实现: // 1. 直接插入排序 void InsertSort(int* a, int n); // 2. 希…...
从文件到块: 提高 Hugging Face 存储效率
Hugging Face 在Git LFS 仓库中存储了超过30 PB 的模型、数据集和 Spaces。由于 Git 在文件级别进行存储和版本控制,任何文件的修改都需要重新上传整个文件。这在 Hub 上会产生高昂的成本,因为平均每个 Parquet 和 CSV 文件大小在 200-300 MB 之间&#…...
Android14 串口控制是能wifi adb实现简介
Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb(1)相关prop属性设置(2)在设置界面或者 ifconfi…...
vue3中 组合式~测试深入组件:事件 与 $emit()
一、语法(props) 第一步:在组件模板表达式中,可以直接用$emit()方法触发自定义事件, <!-- MyComponent --> <button click"$emit(someEvent)">Click Me</button> 第二步父组件可以通过 v-on (缩写为 ) 来监听…...
SQL-labs13-16闯关记录
http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1,依然是一个登录框,POST型SQL注入 2,挂上burpsuite,然后抓取请求,构造请求判断漏洞类型和闭合条件 admin 发生了报错,根据提示闭合方式是(…...
基于微信小程序的停车场管理系统的设计与实现
第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展,各行各业都在摸索移动互联对本行业的改变,不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件,但是APP作为一个只为某个公司服务的一个软件&a…...
DAIR-V2X-R数据集服务器下载
【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗,右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器,选在要下载的文件夹复制路…...
table 拖拽移动
表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
