当前位置: 首页 > news >正文

C++/C方向面试题/概念知识点复习汇总(持续更新)

并非为面试准备,而是集合所需知识点进行巩固加强印象

1.讲讲同步和异步的区别

同步是顺序执行,调用者必须在等待一个任务完成后才可以进行下一个任务,否则就阻塞

异步是并发执行,调用者在发起任务之后立刻返回(通过回调函数,Promise,事件机制通知结果),期间可以去做其他的事情

同步代码相对简单,但是效率可能偏低(需要阻塞等待),适合需要强流程性的操作,例如用户登录验证

异步效率相对较高,但代码较难(如回调地狱),适合实现一些I/O次数繁多,密集的事务,例如文件读写,高并发接口,网络请求

拓展:std::promise是一个线程之间传递结果的模板类,和std::future搭配使用可以获得异步任务的返回值

std::future<int> compute_future() { std::promise<int> prom; std::future<int> fut = prom.get_future(); std::thread([prom = std::move(prom)]() mutable { std::this_thread::sleep_for(std::chrono::seconds(1)); prom.set_value(42); }).detach(); // 创建线程后detach(分离),之后不用join,但也无法控制 return fut; // 返回 future } std::future<int> result = compute_future(); std::cout << result.get(); // 输出 42 int compute_value() { std::this_thread::sleep_for(std::chrono::seconds(1)); return 42; } // 异步执行并自动获取 future std::future<int> fut = std::async(std::launch::async, compute_value); std::cout << fut.get(); // 输出 42

2.函数指针和指针函数的理解

  1. 函数指针是指针,指向一个函数,主要用于实现回调函数、策略模式

  2. 指针函数是函数,返回一个指针,通常用于动态内存分配(返回堆上创立的空间的起始指针)、工厂模式
    现代 C++ 中,函数指针通常用std::function替代,指针函数用智能指针返回更安全。

拓展:工厂模式是一种创建型设计模式,用于封装对象的创建过程,让客户端不直接 new 对象,而是通过工厂方法来获取对象。例如类里的static一个对象创建函数,在外通过类名直接调用

3.如何保证线程安全

首先线程安全是指多个线程并发访问共享数据时,程序行为依然正确,不会出现数据竞争、死锁等问题

所以要保证线程安全主要需要解决数据之间的互相争抢访问,期望控制共享数据的访问,同时避免未定义行为

有以下几点我们可以采用的方法

  • 互斥锁(Mutex):通过使用互斥锁mutex以及锁守卫lock_guard等,确保同一时间只有一个线程可以访问临界区
  • 原子操作(Atomic):一些简单类型的数据,可以用原子操作来避免锁开销,并且保证原子性和内存顺序
  • 读写锁(Shared_mutex):使用读写锁保证同一时间只有一个线程去进行写操作(写独占)
  • 避免内存共享:使用thread_local来避免共享内存,每个线程拥有只属于自己的副本,不用同步
  • 条件变量(Condition Variable):用于等待某个条件成立,避免忙等待

拓展:死锁的原理以及避免

死锁一般是由两个线程互相持有对方需要的锁,并且都在等对方释放,就会一直卡住,谁都释放不了

解决方法:

  • 确保按顺序加锁:确保所有线程都按照一致的顺序加锁,这样就可以避免互相等的情况
  • 使用std::lock锁定多个互斥量:std::lock一次性锁住多个互斥量,且其中也有防死锁算法
  • 使用RAII避免忘记解锁:将加锁操作放在构造函数,解锁操作放在析构函数

unique_lock和lock_guard的区别

unique_lock的开销比lock_guard大,但是unique_lock支持手动解锁,内置lock(),unlock()接口,

在wait()等地方必须使用unique_lock

4.内存泄露是什么含义?如何检测呢?

内存泄漏指的是在动态开辟内存时,因为一些错误的操作,在不再需要这块空间之后并没有及时或者无法释放该空间,随着程序持续运行,泄漏的内存会不断累积,最终可能导致内存耗尽、程序崩溃或系统变慢

  • 静态分析:编译器或工具检查代码模式,发现可能的泄漏路径

  • 动态分析工具:使用Valgrind等工具进行检查

  • 手动插桩检测:重载new/delete并记录

我觉得预防大于检测使用智能指针和RAII:优先使用std::unique_ptr/std::shared_ptr管理动态内存,自动释放。将泄露提前扼杀在摇篮

5.多线程的适用场景?多进程的适用场景?

首先多线程是共享进程地址空间,切换很方便,通信也方便,但是隔离性不高,一个线程崩全部就崩,而且还需要处理同步(锁,原子操作) 单核

多进程拥有自己独立的地址空间,隔离性强,一个崩掉可以单独修复不会影响别的进程,但是通信切换不方便,更安全,且可以跨多机

多线程适用于需要高频共享数据、低延迟并行计算的场景,比如图像处理、Web 服务器缓存共享。它的优点是通信快、切换轻量,但缺点是需要处理锁竞争、死锁,且一个线程崩溃会影响整个进程。

多进程适用于需要高可靠性、安全隔离的场景,比如浏览器标签页、守护监控进程。每个进程独立,崩溃可单独恢复;天然避免了锁问题,但进程间通信(如管道、共享内存)开销较大,创建成本也更高。

在实际 C++ 开发中,我会根据任务特点选择:如果任务之间共享大量数据且频繁交互,优先多线程 + 锁/无锁结构;如果任务独立、需要强容错,优先多进程 + 消息队列

6.场景题:单机,TCP服务器和UDP服务器能不能占用同一个端口号?

可以。TCP 和 UDP 是独立的传输层协议,操作系统维护独立的端口号空间。例如 DNS 服务器就同时监听 UDP 53 和 TCP 53。

......操作系统的网络栈为每种协议维护独立的端口绑定表
即:TCP 的 8080 号端口是一张表,UDP 的 8080 号端口是另一张表。

7.select和epoll的适用场景

select在内核以及返回后的用户态都需要轮询一边所有fd来查找就绪id,非常的耗时耗力

epoll则是利用回调函数,当就绪了回调函数就会把这个fd放入就绪链表,所以只要检查链表为不为空,然后复制到数组就行了,省时省力

selectepoll都是 I/O 多路复用机制,但适用场景明显不同。

select适合连接数较少(通常 < 1024)且所有连接都比较活跃的场景,比如小型 demo、跨平台简单网络程序。它的缺点是每次调用都要线性扫描全部文件描述符,连接数增加后效率线性下降。

epoll适合高并发、大量连接(数千到数十万)且大部分连接处于空闲状态的场景,比如 Web 服务器、即时通讯后端。它采用事件驱动方式,只返回就绪的 fd,时间复杂度 O(1),并且支持边缘触发,性能远优于select

http://www.jsqmd.com/news/594415/

相关文章:

  • SEO_资深运营揭秘:真正有效的SEO技巧有哪些
  • Harness Engineering 实战指南(非常详细),AI 写代码从入门到精通,收藏这一篇就够了!
  • 2026年4月区块链平台测评:数字资产合规流通五大靠谱选择综合调研推荐 - 品牌推荐
  • 补题记录2
  • ESPectro:面向IoT的ESP8266硬件抽象库设计与实践
  • Facebook短剧出海攻略
  • 【PAT甲级真题】- Talent and Virtue (25)
  • 半导体盛会哪家好?2026年度主流芯坛半导体盛会 - 品牌2026
  • 2026年计算机科学论文降AI工具推荐:代码注释和算法描述部分如何降
  • 半导体行业展会推荐:汇聚高规格半导体展会搭建产业交流合作平台 - 品牌2026
  • 5分钟充电500公里?更像为炒作噱头,实现并不容易!大城市建设可能被消防限制!
  • 代码写不动了?传统程序员不转型AI工程化提示词专家,将被AI助手彻底平替
  • 手把手拆解ST FOC库:Circle Limitation的查表法实现与优化技巧
  • 人到中年,生日收到这三条短信,我读了很久
  • 模型轻量化实践:在4GB内存设备运行OpenClaw+Phi-3-vision
  • 半导体全产业链展会哪家好?2026 年半导体优选行业盛会推荐 - 品牌2026
  • 省考面试必看!初心教育不玩虚的,真实口碑+实战演练,上岸更稳
  • 西交提出 OdysseyArena:让智能体真正“学会探索”的长程归纳推理基准
  • 12 3456(2)
  • 内存市场为何迅速崩盘?实在是个人市场变化太快了,美韩芯片图谋破裂了
  • 实测对比:ChatGPT、Gemini、Grok、Claude 在四个开发任务中的表现差异
  • 白嫖DeepSeek、GLM、MiniMax、Kimi等大模型,每天 1亿 Token 免费领!
  • JavaScript 解构赋值
  • STM32 定时器与 PWM 输出:电机调速、LED 呼吸灯实战
  • 为什么80%AI率降完后还有残留?根本原因在这
  • OpenClaw家庭作业助手:Qwen3-14B解析数学题并分步讲解
  • MCP服务赋能供应链、销售与财务高效运转
  • 高呼电车渗透率创新高?忘记2025年渗透率近六成的历史纪录了!
  • 2026年必看:5大高性价比室内高尔夫模拟器品牌推荐
  • Jupyter notebook学习容易忘的点