博雷顿科技股份公司 C++ 二面复盘

1. 自我介绍

我其实跟一面介绍的差不多 , 之前公司的实习,主要参与 C++ 后端开发工作。 实习期间负责消息处理和服务端模块开发,涉及功能迭代、线上问题排查和性能优化。 技术栈以 C/C++ 为主,熟悉 STL、Linux 多线程和 TCP/IP 网络编程,了解 MySQL、Redis。 整体偏工程实践,关注代码质量、系统稳定性和性能优化,希望继续在 C++ 后端方向深入发展。

2. 项目介绍

二面比一面问得更深入,围绕项目追问了很多实际场景问题,不只是做了什么,更关注为什么这么做、怎么验证、出了问题怎么兜底

大概的追问方向如下:

  • 高并发下延迟抖动时,如何快速判断是锁竞争、I/O 瓶颈还是下游阻塞
  • 无锁队列在生产环境如何保证稳定性,出现积压和背压时如何处理
  • 状态同步短暂不一致时如何保证业务可用性,是否有回滚或补偿方案
  • 内存泄漏和内存碎片如何监控,如何从现象定位到具体代码
  • 性能优化后如何证明有效,压测指标和线上指标如何对齐

整体感受:二面更看重真实工程能力和场景化问题处理能力。

3. 智能指针底层实现

  • unique_ptr:独占所有权,不能拷贝、可以移动
  • shared_ptr:共享所有权,底层通过控制块维护引用计数
  • weak_ptr:弱引用,不增加强引用计数,用于解决循环引用

补充:对象在强引用计数归零时析构;控制块在弱引用计数归零后释放。

4. C++11 多线程

常见知识点:

  • std::thread(线程创建与管理)
  • std::mutex、std::lock_guard、std::unique_lock(互斥与加锁)
  • std::condition_variable(线程等待与唤醒)
  • std::atomic(无锁原子操作)

实践中通常结合线程池 + 条件变量进行任务分发,使用原子变量做轻量同步。

5. 引用计数存放位置

shared_ptr 的引用计数存放在控制块中,不在对象本体里。 控制块通常位于堆上,包含强引用计数、弱引用计数、删除器等信息。

6. 代码题:实现 Trie

Trie或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。

请你实现 Trie 类:

  • Trie() 初始化前缀树对象。
  • void insert(String word) 向前缀树中插入字符串 word 。
  • boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
  • boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
class Trie {
private:
    struct Node {
        Node* child[26];
        bool isEnd;
        Node() : isEnd(false) {
            for (int i = 0; i < 26; ++i) child[i] = nullptr;
        }
    };

    Node* root;

public:
    Trie() {
        root = new Node();
    }

    void insert(const string& word) {
        Node* cur = root;
        for (char c : word) {
            int idx = c - 'a';
            if (cur->child[idx] == nullptr) {
                cur->child[idx] = new Node();
            }
            cur = cur->child[idx];
        }
        cur->isEnd = true;
    }

    bool search(const string& word) {
        Node* cur = root;
        for (char c : word) {
            int idx = c - 'a';
            if (cur->child[idx] == nullptr) return false;
            cur = cur->child[idx];
        }
        return cur->isEnd;
    }

    bool startsWith(const string& prefix) {
        Node* cur = root;
        for (char c : prefix) {
            int idx = c - 'a';
            if (cur->child[idx] == nullptr) return false;
            cur = cur->child[idx];
        }
        return true;
    }
};

7.反问

之后的评估重点更偏向编码能力、系统设计还是业务理解

如果入职,前两个月会优先承担哪类任务

团队技术方案评审最看重哪些维度

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

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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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