得物 软件开发-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++工程能力.

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

相关推荐

今天 00:31
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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