得物 软件开发-C++ 二面

1. 自我介绍

2. 说一下你的代码风格

很懵啊, 为啥问这个问题

3. 你开发的高并发组件相对于通用库有什么优势?

通用库(如 Boost/Poco)为满足泛型需求,包含了大量抽象、虚函数和全场景适配,较为臃肿。我自己开发的组件优势在于“极致裁剪”:针对特定业务场景(如固定大小的数据包)定制内存池,避免内核态内存碎片;针对单一生产者消费者模型替换重量级锁,采用无锁队列或轻量级同步原语,从而压榨出更高的极限吞吐量。

4. 什么是多核 CPU 的伪共享(False Sharing)?如何解决?

伪共享是指多个线程同时修改位于同一缓存行(Cache Line,通常为64字节)不同位置的独立变量,导致整个缓存行频繁失效,极大地影响多核并发性能。解决办法是使用内存对齐,强制将变量分配到不同的缓存行。代码:

// C++11 缓存行对齐,避免伪共享
struct alignas(64) AlignedData {
    int value;
};
AlignedData threadA_data;
AlignedData threadB_data;

5. 多线程间需变量交互,如何高效控制锁?

  1. 降低锁的粒度:采用分段锁思想,按通道或数据类型分片,每片单独加锁。
  2. 读写锁分离:读多写少的场景使用 std::shared_mutex。
  3. 批量处理:数据先在线程局部存储(Thread Local Storage)中积攒,达到一定数量后再统一加锁提交,大幅减少争锁频率。
  4. 直接使用成熟库:优先使用 TBB (Intel Threading Building Blocks) 的并发队列或无锁结构。

6. 了解无锁编程吗?底层依赖什么机制?

无锁编程底层依赖 CPU 提供的硬件级原子指令:CAS(Compare-And-Swap)。在 C++ 中通过 std::atomic 提供。代码(无锁更新示例):

#include <atomic>

std::atomic<int> shared_val(0);

void update_value(int new_val) {
    int expected = shared_val.load();
    // 如果 shared_val 当前值等于 expected,则更新为 new_val;否则将 expected 更新为 shared_val 的最新值
    while (!shared_val.compare_exchange_weak(expected, new_val)) {
        // 循环重试,直到更新成功
    }
}

7. 平时如何处理代码异常?

  1. 错误码机制:预见性的业务错误(如文件不存在、网络超时),使用特殊的返回值或 std::optional 传递。
  2. try-catch 体系:真正的异常状态(内存分配失败、越界)抛出 std::exception,在模块边界进行统一 catch 兜底。
  3. noexcept:确保不会抛出异常的函数(特别是移动构造和析构)加上 noexcept 优化性能。

8. C/C++ 异常处理的四层机制是什么?

  1. 函数内 try-catch:处理 C/C++ 语言层面的 throw 异常。
  2. SEH (结构化异常处理):Windows 层面拦截除零、内存越界等硬件异常(__try / __except)。
  3. VEH (向量化异常处理):全局异常回调,优先级最高,常用于捕捉程序崩溃生成 Dump 记录。
  4. Debug 调试异常:前三层未处理时,如果有调试器则中断,否则程序直接崩溃。

9. 构造函数或析构函数中可以抛出异常吗?

  • 构造函数可以:但抛出异常后对象创建失败,析构函数不会被调用,需确保已分配的裸资源被手动清理(优先用智能指针防泄漏)。
  • 析构函数绝对不能:C++11 起析构默认 noexcept。若在异常栈展开时析构再次抛出异常,会导致程序直接调用 std::terminate() 强制崩溃。

10. 除了 gdb,如果碰到隐蔽的内存泄漏或越界问题,怎么排查?

优先使用 Address Sanitizer (ASan)。它是编译器自带的内存错误检测工具,执行速度快。编译时在 Makefile 中加上 g++ -fsanitize=address -g main.cpp 即可。运行时一旦发生越界、使用了释放后的内存(Use-After-Free)或内存泄漏,程序会立刻报错并打印具体的代码行号栈。

11. 是否会 Debug?Makefile里加

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论
这个感觉好难
点赞 回复 分享
发布于 03-03 10:48 浙江

相关推荐

不愿透露姓名的神秘牛友
02-17 21:01
已编辑
大家好,鼠鼠我是某中九软院大三一名学生,保研无望,现在在考研和就业之间艰难抉择,想听听各位大佬的意见。我现在在一个小厂实习,java后端开发,已经快两个月了,如果选择就业应该会继续实习下去,到4&nbsp;5月份找暑期实习。我想直接就业,但是家里人非常希望我读研,觉得好不容易到了这样一个平台不读下去太可惜了,读研人生后来能有更多选择。(但是决定权还是在我手里)我现在的主要顾虑1.读研的性价比真的比本科就业高吗读研要再度过枯燥的三年,如果遇到好老师放实习还好,遇不到好老师就要白打三年工了。2.研究生起步工资高,可能会晚被裁几年。但是本科生早工作3年,工资也会有提升。对后续的职业生涯孰优孰劣呢3.我现在本科就业只能走开发岗,读研的话双九可以走算法岗吗,算法岗的竞争是否也很激烈。我听说很多研究生出来照样干的是开发岗,如果这样还不如本科就直接干开发了。4.ai现在发展的如此之快,很多公司的大部分代码工作都已经由ai承担了。如果本科就业开发岗,这个行业还能干多久?读研的话则会有3年时间观望5.我认为我这段实习没学到什么东西,基本就是crud和一些简单业务,算法和八股现在都还没怎么开始,如果想要进大厂是不是很难了。如果考研的话本校应该会捞的,考上的概率能大一些虽然这个软件里大部分uu都是选择就业的,但是我还是想听听大伙的意见。
冰炸橙汁_不做oj版:能保研985就保研,能去大厂就业就去就业,考研是下策,只有学历不好又想进大厂的才考虑考研
点赞 评论 收藏
分享
目前是郑州大学的研二,想要找大数据开发的工作,目前没有实习,现在已经学了ssg的离线数仓,能找到暑期实习吗?我是应该坚持找暑期实习还是再学一下实时数仓。
睡不着的二进制:熟悉八股,数仓架构,组建原理,手撕sql,准备的差不多百分之60道80就可以投递,前提简历准备好,边面试边准备边查漏补缺
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务