优必选 C++开发工程师 二面

1. 常见 STL 容器有哪些?vector/list、map/unordered_map 的区别与使用场景

常见容器:vector、deque、list、set、map、unordered_map、unordered_set、queue、stack。

vector vs list:

  • vector 连续内存,随机访问 O(1),尾插高效,cache 友好;
  • list 链表结构,任意位置插删 O(1)(已知迭代器),但随机访问差、cache 不友好。

map vs unordered_map:

  • map 红黑树,O(logN),有序,可范围查询;
  • unordered_map 哈希表,均摊 O(1),无序,最坏可退化。

使用场景:

  • 需要顺序、范围查询、稳定复杂度:map;
  • 追求高频点查性能:unordered_map;
  • 内存局部性和遍历性能优先通常先选 vector。

2. 智能指针:shared_ptr 是线程安全的吗?为什么?

结论分两层:

  1. 控制块引用计数的增减是线程安全的(通常是原子操作);
  2. 指向对象本身的读写不是天然线程安全,仍需锁或无锁同步。

另外,同一个 shared_ptr 实例被多线程同时读写(如 reset)也需要外部同步。 所以“shared_ptr 线程安全”只成立在“计数管理”层面,不等于“对象访问安全”。

3. 除了基础单例,如何实现“线程安全 + 防止反序列化破坏”的工程化单例?

推荐“函数内静态对象”(Meyers Singleton),C++11 起初始化线程安全。 如果系统涉及序列化/反射/插件热加载,还要约束拷贝、移动、构造入口。

代码:

class ConfigCenter {
public:
    static ConfigCenter& instance() {
        static ConfigCenter inst;
        return inst;
    }

    ConfigCenter(const ConfigCenter&) = delete;
    ConfigCenter& operator=(const ConfigCenter&) = delete;
    ConfigCenter(ConfigCenter&&) = delete;
    ConfigCenter& operator=(ConfigCenter&&) = delete;

private:
    ConfigCenter() = default;
    ~ConfigCenter() = default;
};

4. 在“工业 IoT 实时控制网关”项目中你用了哪些容器?为什么这么选?

我在该项目里主要用了:

  • vector:存设备连接快照(遍历密集,cache 友好);
  • unordered_map:device_id -> session 快速路由;
  • deque:收发缓冲队列(头尾操作频繁);
  • priority_queue:定时任务超时管理。 选型原则是“访问模式优先”,而不是“容器功能越多越好”。

5. JsonRpc 分层设计如何做,才能支持高并发与可观测?

答案: 可拆为 5 层:

  1. Transport 层:TCP/WebSocket 收发;
  2. Codec 层:JSON 编解码与协议校验;
  3. Dispatcher 层:方法路由、参数绑定;
  4. Service 层:业务实现与资源访问;
  5. 治理层:超时、重试、限流、熔断、Tracing。

关键点:

  • request_id 全链路透传;
  • 错误码分层(协议错误/业务错误/系统错误);
  • 与线程模型解耦,避免业务阻塞 IO 线程。

6. muduo 的线程模型和架构是什么?主从 Reactor 相比纯线程池优势在哪?

muduo 典型是 one loop per thread:

  • 主 Reactor(acceptor)负责接入;
  • 子 Reacto

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

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

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

全部评论

相关推荐

02-12 13:01
已编辑
深圳店小秘_赛狐erp_Java开发
ai时代其实做底层的基础模型开发永远都是少数人,而大部分人其实做的依然是开发方向,agent,rag,后端这些。可能有人说我学agent不需要学后端语言,其实并不是这样。我看了公司的ai项目,其实也会涉及到一些缓存,数据库的存储。agent开发不止需要的是对于大模型的基础性理解,还是需要一定的工程能力。刚开始企业在招聘的时候,主要考察ai是因为产品还在初始阶段,用户量不算很大。用户量大到一定程度就需要工程能力了,降级,容错,数据存储,性能优化,这是工程能力,而ai幻觉,输出质量稳定性,agent编排,微调需要的是ai能力。以下是更偏后端的ai开发的全栈能力1.  基础后端能力一门业务语言,框架,体系(java/golang/cpp)核心是构建后端服务,语言并不是最重要的,框架也不是最重要的。后端能力学框架并不是框架本身,而是涉及到底层的网络/io/数据存储/操作系统。为啥用多路复用,怎么结合业务逻辑配置缓存淘汰策略,其实是对计算机本质的理解。框架,中间件都是一层套一层的,最终会回归到最本质的io与trade off2.ai能力超越调用API,需理解大模型的核心原理(如Transformer架构、注意力机制)及其能力边界。ai应用侧的能力prompt,rag,mcp,langchainagent编排3.大数据处理能力随着互联网公司的数据量增大,普通的mysql以及不能支持高效的查询。对于一些复杂的聚合计算,报表这些通过简单的行式存储(tp)已经不能满足未来的需要,所以出现了列式存储(clickhouse/doris)。需要了解从tp数据库的清洗流程(flink流式处理/离线处理)ai时代我认为,数据的作用将会不断增大4.垂直领域的业务能力互联网(金融/电商/社交/内容/直播)都需要ai来赋能以我所在的跨境电商行业为例,你是否熟悉电商下单到跨境物流(头程,尾程)再到合规等业务,能否打通业务全链路形成闭环为什么未来需要全栈能力?(1)ai提升了代码开发的效率,如果我们把java,大数据,ai分成3个岗位,中间的沟通时间就会浪费掉,而ai更加擅长的其实是技术细节的coding(2)做ai开发prompt,rag,agent编排的偏向ai侧的工程师,其实是需要非常熟悉业务的,而java工程师最擅长的就是业务,不如让一个人去做,效率最高,不懂业务做ai开发效率是没那么高的就像美团履约团队,让前端去转后端一样,有可能未来,全栈正在成为一种趋势所以,先广度,再深度,先把工程能力和ai能力的广度建立起来,再对一些方面进行深挖最后再来谈谈为什么我认为ai是取代不了程序员的。我认为最核心的一点就是未来写代码有可能是一个需要情商的事情?什么叫需要情商,就是你废力去做的一个需求,可能用户根本不需要。举个例子,产品问开发,你认为这个需求最多能够承受多少数据量,开发问产品,你认为客户的需求能做到多少数据量就可以了。像saas公司,你真的要做到满足客户100%的需求嘛,不是的,因为你真满足了,你的服务器成本会很高,公司发现不划算。这就是一个trade off的问题所以本质上程序员开发涉及到情商/成本trade off/商业化思维的时候,ai做不了了还有一点就是行业的业务,以我在saas公司的经历,我认为saas公司其实就是在垂类赛道把行业的业务知识搞透了,赢得了客户的信赖,而其中一些业务设计,ai理解起来会非常困难。垂直领域的业务知识或许会成为程序的壁垒之一
聊聊我眼中的AI
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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