【CPP面经】科大讯飞 &&腾讯后端开发面经分享

文章目录

  • [C++ 面试问题整理](#C++ 面试问题整理)
    • 基础问题简答
      • [1. 内存对齐](#1. 内存对齐)
      • [2. `this` 指针](#2. this 指针)
      • [3. 在成员函数中删除 `this`](#3. 在成员函数中删除 this)
      • [4. 引用占用内存吗?](#4. 引用占用内存吗?)
      • [5. C++ 越界访问场景](#5. C++ 越界访问场景)
      • [6. 进程通信方式](#6. 进程通信方式)
      • [7. 无锁队列实现](#7. 无锁队列实现)
      • [8. `ping` 在哪一层?实现原理?](#8. ping 在哪一层?实现原理?)
      • [9. HTTPS 流程](#9. HTTPS 流程)
      • [10. GDB 使用及 CPU 高使用定位](#10. GDB 使用及 CPU 高使用定位)
      • [11. 智能指针](#11. 智能指针)
      • [12. 右值引用与移动语义](#12. 右值引用与移动语义)
      • [13. `coredump` 与 `minidump` 区别](#13. coredumpminidump 区别)
      • [14. 设计模式](#14. 设计模式)
    • 扩展问题详解
      • [0. 自我介绍 + 项目介绍 + 问题解决](#0. 自我介绍 + 项目介绍 + 问题解决)
      • [1. 智能指针详解](#1. 智能指针详解)
      • [2. STL 容器底层原理](#2. STL 容器底层原理)
      • [3. B+ 树详解](#3. B+ 树详解)
      • [4. 线程创建方式](#4. 线程创建方式)
      • [5. DFS 和 BFS 过程](#5. DFS 和 BFS 过程)
      • [`malloc` / `free` vs `new` / `delete`](#malloc / free vs new / delete)
      • [`shared_ptr` 线程安全吗?](#shared_ptr 线程安全吗?)
    • 内存对齐详解
    • [右值引用 vs. 移动语义详解](#右值引用 vs. 移动语义详解)
    • [`this` 指针详解](#this 指针详解)
    • [`delete this` 详解](#delete this 详解)
    • 引用占用内存详解
    • 越界访问详解
    • 无锁队列详解
    • [`ping` 详解](#ping 详解)
    • [HTTPS 流程详解](#HTTPS 流程详解)
    • [定位 `new` 详解](#定位 new 详解)
    • 线程池优点
    • [TCP 三次握手与四次挥手](#TCP 三次握手与四次挥手)
    • 服务器使用守护进程
    • [InnoDB vs MyISAM](#InnoDB vs MyISAM)
    • 索引的作用
    • 高精度加法
    • 锁机制
    • [TCP 三次握手额外信息](#TCP 三次握手额外信息)
    • [B+ 树详解](#B+ 树详解)

以下是整理后的 Markdown 格式内容,已根据你的需求从 <DOCUMENT> 中提取并重新组织,确保逻辑清晰、格式规范,适合直接复制到博客发布。内容涵盖了所有问题及其答案,并对部分复杂问题进行了扩展讲解。


C++ 面试问题整理

以下是常见的 C++ 面试问题及其答案,涵盖内存管理、并发、网络协议、数据库等多个方面,适合复习或面试准备。

基础问题简答

1. 内存对齐

  • 作用:提高 CPU 访问效率,避免跨对齐边界访问导致性能下降或硬件错误。

  • 实现 :编译器通过插入填充字节,使数据按类型对齐(如 int 按 4 字节对齐);可用 #pragma pack(n)alignas(n) 控制。

  • 示例

    cpp 复制代码
    struct A { char a; int b; short c; }; // sizeof(A) = 12,填充 3+2 字节

2. this 指针

  • 作用:指向当前对象实例,用于访问成员变量和方法,支持链式调用。

  • 实现 :编译器隐式传递,成员函数接收 this 作为隐藏参数(如 void A::func(A* this))。

  • 示例

    cpp 复制代码
    class A { int x; void set(int x) { this->x = x; } };

3. 在成员函数中删除 this

  • 后果:释放对象内存,后续访问会导致未定义行为(如崩溃)。

  • 注意:仅适用于动态分配对象,需立即返回避免继续使用。

  • 示例

    cpp 复制代码
    class A { void destroy() { delete this; return; } };

4. 引用占用内存吗?

  • 答案:通常不占额外内存(作为别名优化掉),但在类成员等场景可能占用指针大小(4/8 字节)。

  • 示例

    cpp 复制代码
    int a = 10; int& ref = a; // ref 不占额外空间

5. C++ 越界访问场景

  • 数组越界(如 arr[10] 访问大小为 5 的数组)。

  • 野指针或已释放内存访问。

  • 容器操作(如 vectoroperator[] 未检查边界)。

  • 示例

    cpp 复制代码
    int arr[5]; arr[10] = 1; // 未定义行为

6. 进程通信方式

  • 管道(匿名/命名)、消息队列、共享内存、信号量、套接字、信号、mmap 文件映射、Unix 域套接字。

7. 无锁队列实现

  • 方法:基于原子操作(如 CAS)管理头尾指针。

  • 示例

    cpp 复制代码
    std::atomic<Node*> head; // 使用 CAS 更新

8. ping 在哪一层?实现原理?

  • 层级:网络层(ICMP 协议)。
  • 原理:发送 ICMP Echo 请求,接收 Echo 响应,计算 RTT 判断连通性。

9. HTTPS 流程

  1. 客户端发送 ClientHello(TLS 版本、加密套件)。
  2. 服务器返回 ServerHello 和证书。
  3. 客户端验证证书,生成预主密钥并加密发送。
  4. 双方派生对称密钥,加密通信。

10. GDB 使用及 CPU 高使用定位

  • 使用gdb attach <PID>thread apply all bt 查看堆栈。
  • 定位top -H 找高 CPU 线程,gdb 分析热点代码。

11. 智能指针

  • shared_ptr:引用计数,共享所有权。
  • unique_ptr:独占所有权,支持移动。
  • weak_ptr:解决循环引用。

12. 右值引用与移动语义

  • 右值引用(&&:绑定临时对象。
  • 移动语义:通过右值引用转移资源,避免深拷贝。
  • 差异:右值引用是语法手段,移动语义是优化策略。

13. coredumpminidump 区别

  • 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 线程。

  • 示例

    cpp 复制代码
    std::thread t([]{ std::cout << "Thread\n"; });

5. DFS 和 BFS 过程

  • DFS(深度优先搜索):递归或栈,深入一条路径。
  • BFS(广度优先搜索):队列,按层遍历。

malloc / free vs new / delete

  • malloc / free:C 风格,仅分配/释放内存,不调用构造/析构。

  • new / delete:C++ 风格,分配内存并调用构造/析构。

  • 示例

    cpp 复制代码
    int* p = new int(10); delete p;

shared_ptr 线程安全吗?

  • 引用计数:线程安全(原子操作)。

  • 对象访问:不安全,需外部加锁。

  • 示例

    cpp 复制代码
    std::shared_ptr<int> sp = std::make_shared<int>(10);

内存对齐详解

  • 作用:提高 CPU 访问效率,避免硬件错误。

  • 实现

    • 默认对齐:按类型大小(如 int 4 字节)。
    • 控制:#pragma pack(n)alignas(n)
  • 示例

    cpp 复制代码
    #pragma pack(2)
    struct A { char a; int b; }; // sizeof(A) = 6

右值引用 vs. 移动语义详解

  • 右值引用(&&:绑定临时对象,允许修改。

  • 移动语义:转移资源,避免拷贝。

  • 示例

    cpp 复制代码
    std::string s1 = "Hello";
    std::string s2 = std::move(s1); // s1 变空

this 指针详解

  • 作用:访问当前对象,支持链式调用。

  • 实现:隐式参数,编译器传递。

  • 示例

    cpp 复制代码
    class A { A& set(int x) { this->x = x; return *this; } };

delete this 详解

  • 后果:释放对象内存,后续访问未定义。

  • 正确用法:动态对象,删除后立即返回。

  • 示例

    cpp 复制代码
    class A { void destroy() { delete this; } };

引用占用内存详解

  • 一般情况:不占内存(优化为别名)。

  • 特殊情况:类成员引用占指针大小。

  • 示例

    cpp 复制代码
    struct A { int& ref; A(int& r) : ref(r) {} };

越界访问详解

  • 场景:数组越界、野指针、容器操作错误。

  • 避免 :边界检查,使用 at()

  • 示例

    cpp 复制代码
    std::vector<int> v{1, 2}; v.at(5); // 抛异常

无锁队列详解

  • 实现:原子操作(如 CAS)管理指针。

  • 示例

    cpp 复制代码
    std::atomic<Node*> head; // CAS 更新

ping 详解

  • 层级:网络层(ICMP)。

  • 原理:发送 Echo 请求,接收 Echo 响应。

  • 示例

    bash 复制代码
    ping 8.8.8.8

HTTPS 流程详解

  • 步骤
    1. ClientHello:发送 TLS 参数。
    2. ServerHello:返回证书。
    3. 密钥交换:生成对称密钥。
    4. 加密通信。

定位 new 详解

  • 定义:在已有内存上构造对象。

  • 用途:内存池、嵌入式系统。

  • 示例

    cpp 复制代码
    char buf[sizeof(int)]; int* p = new (buf) int(42);

线程池优点

  • 复用线程,减少创建销毁开销。
  • 控制线程数,避免上下文切换。
  • 任务队列提升吞吐量。

TCP 三次握手与四次挥手

  • 三次握手:建立连接,交换 ISN、窗口大小。
  • 四次挥手:确保数据传输完成,防止丢失。

服务器使用守护进程

  • 优点:后台运行,独立环境,持续服务。
  • 示例:Nginx、MySQL。

InnoDB vs MyISAM

  • InnoDB:事务支持,行级锁,崩溃恢复。
  • MyISAM:读性能高,表级锁,无事务。

索引的作用

  • 提高查询速度,加速排序和 JOIN。

  • 示例

    sql 复制代码
    CREATE INDEX idx ON table(col);

高精度加法

  • 实现:字符串模拟,处理进位。

  • 应对非法输入:校验数字格式,去除前导零。

  • 示例

    cpp 复制代码
    string add(string a, string b);

锁机制

  • 类型:互斥锁、读写锁、自旋锁。

  • 示例

    cpp 复制代码
    std::mutex mtx; std::lock_guard lock(mtx);

TCP 三次握手额外信息

  • 交换 ISN、窗口大小、MSS、时间戳等。

  • 示例

    plaintext 复制代码
    SYN(seq=x) -> SYN-ACK(seq=y, ack=x+1)

B+ 树详解

  • 叶子节点:InnoDB 中双向链表,页内单向。
  • 链表类型
    • 单向:节省空间。
    • 双向:支持范围查询。
    • 循环:轮询调度。

以上内容已整理为 Markdown 格式,直接复制即可发布到博客。每个问题都有简洁回答或详细讲解,涵盖代码示例和关键点,适合技术分享或面试复习。

相关推荐
青春_strive几秒前
Qt:事件
开发语言·qt
Halsey Walker6 分钟前
QT实现简约美观的动画Checkbox
c++·qt·动画
吉星9527ABC10 分钟前
Linux下的c进程和java进程的通信-UnixSocket
java·linux·c语言·unixsocket通讯
筑梦之路16 分钟前
CentOS 7 aarch64上制作kernel rpm二进制包 —— 筑梦之路
linux·运维·centos
浪九天17 分钟前
Java常用正则表达式(身份证号、邮箱、手机号)格式校验
java·开发语言·正则表达式
炬火初现18 分钟前
仿mudou库one thread oneloop式并发服务器
服务器·c++·muduo
pitt199718 分钟前
企业日常工作中常用的 Linux 操作系统命令整理
linux·运维·操作系统命令
初级代码游戏21 分钟前
MAUI(C#)安卓开发起步
android·开发语言·c#·hyper-v·maui·haxm·aehd
乄北城以北乀24 分钟前
muduo库源码分析:TcpConnection 类
linux·数据结构·c++·后端·网络协议·tcp/ip·visual studio
赔罪25 分钟前
Python 面向对象高级编程-定制类
服务器·开发语言·前端·python