滴滴 IOS客户端-C++ 一面
介绍 C++11 的一些新特性
C++11 是现代 C++ 的分水岭,重点是语言层面支持并发、资源管理和泛型能力增强。面试里可以优先说这几类:语法简化、内存与对象语义、并发库、类型推导。
常见可答内容是:auto 和 decltype、范围 for、右值引用与移动语义、nullptr、lambda、std::thread/mutex/condition_variable、smart pointer、unordered_map、constexpr、static_assert。如果只给一句总结,可以说 C++11 让“写对代码”和“写高性能代码”同时更容易。
智能指针的实现原理
本质是 RAII:把“资源释放”绑定到对象生命周期。对象离开作用域时自动析构,析构里释放资源。 unique_ptr 独占所有权,不可拷贝可移动;shared_ptr 通过控制块维护强引用计数,计数归零时释放对象;weak_ptr 只观察不拥有,不增加强引用,用来打破循环引用。
shared_ptr 的关键结构是控制块:通常包含强计数、弱计数、删除器等元数据。拷贝 shared_ptr 会原子地增加强计数,析构会原子减少;当强计数变 0,执行删除器销毁对象;当弱计数也为 0,再释放控制块。
智能指针的优缺点
优点是显著降低手动 new/delete 出错概率,减少泄漏和悬空指针;异常路径也能自动回收资源。缺点主要在 shared_ptr:有额外控制块和原子计数开销,错误使用容易出现循环引用,且所有权语义复杂时可读性下降。
实践里通常建议:默认用 unique_ptr,确实需要共享生命周期再用 shared_ptr,涉及双向关系时引入 weak_ptr。
C++ 中的内存分布
进程虚拟内存通常可分为代码区、全局/静态区、堆、栈,以及常量区(通常映射在只读段)。 代码区存放指令;全局/静态区存放全局变量和静态变量;堆由程序员动态申请释放;栈存函数调用帧、局部变量和返回地址。不同平台细节有差异,但面试讲这个模型足够。
HTTP 和 HTTPS 介绍与区别
HTTP 是明文传输的应用层协议;HTTPS 是“HTTP + TLS”,即在 HTTP 之下加一层加密与身份认证。 核心区别是 HTTPS 提供机密性、完整性、身份认证;HTTP 默认不提供这些安全保证。HTTPS 还需要证书体系(CA)来建立信任链。
HTTPS 相比 HTTP 如何保证安全
HTTPS 通过 TLS 握手协商加密参数并完成密钥建立,之后应用数据使用对称加密传输,保证机密性;通过 MAC/AEAD 保证完整性;通过服务器证书和 CA 链验证身份,防止中间人伪造服务端。 简化理解:握手阶段解决“我在和谁通信、密钥怎么安全产生”,传输阶段解决“数据不被看见、不被篡改”。
HTTP 1.0、2.0、3.0 的升级点
HTTP/1.0 以短连接为主,请求一个资源常对应一次 TCP 连接,效率低。 HTTP/2 在同一 TCP 连接上做二进制分帧和多路复用,支持头部压缩与服务端推送,明显降低连接与传输开销。 HTTP/3 基于 QUIC(UDP)实现,内建 TLS,减少握手时延并缓解 TCP 队头阻塞,在弱网和高丢包场景下体验更稳。
介绍 GET 和 POST
GET 语义上用于获取资源,强调幂等和可缓存,请求参数常放在 URL 查询串。 POST 语义上用于提交数据创建/触发处理,通常不幂等,请求体可承载更大且结构化的数据。 注意:GET/POST 是语义约定,不是“安全与否”的直接判断;安全主要看是否用 HTTPS、是否做鉴权与校验。
MySQL 中什么是索引,如何提高查询速度
索引是帮助数据库快速定位数据的数据结构,MySQL InnoDB 常用 B+ 树索引。没有索引时常要全表扫描;有索引后可先在索引树中定位目标范围,再回表或直接覆盖读取,I/O 显著减少,所以查询更快。 代价是索引会占空间,且会增加写入时维护成本,因此索引设计要平衡读写。
数据库主键和外键的概念与作用
主键用于唯一标识一行记录,要求唯一且非空,是实体身份。 外键用于建立表与表之间的引用关系,约束子表值必须在父表存在,用于保证参照完整性。 主键解决“是谁”,外键解决“和谁有关”。
数据库三大范式是做什么的
范式的目标是减少数据冗余、避免更新异常、提升一致性。 第一范式强调字段原子性;第二范式要求非主属性完全依赖主键,解决部分依赖;第三范式要求非主属性不传递依赖主键,进一步减少冗余。 工程中通常“范式化建模 + 适度反范式”并用:核心交易数据重一致,查询热点可冗余换性能。
本专栏系统梳理C++面试高频考点,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力。