岗位题目
C/C++相关面试题第 2 页
C++面向对象的特性?
C++面向对象的特性?这道腾讯牛客题的关键是围绕“C++ 面向对象特性”讲清概念、机制、取舍和边界。C++ 面向对象常讲封装、继承和多态。封装把数据和行为组织成类并控制访问;继承复用和扩展基类接口;多态通过虚函数让基类指针或引用在运行时调用派生类实现。
给定一个有序数组,统计指定元素出现的次数?
给定一个有序数组,统计指定元素出现的次数?这道腾讯牛客题的关键是围绕“有序数组统计元素次数”讲清概念、机制、取舍和边界。有序数组统计 target 出现次数,最稳的方法是两次二分:lower_bound 找第一个大于等于 target 的位置,upper_bound 找第一个大于 target 的位置,次数等于 upper-lower。
树有哪几种遍历方式?
树有哪几种遍历方式?这道腾讯牛客题的关键是围绕“树的遍历方式”讲清概念、机制、取舍和边界。常见树遍历包括前序、中序、后序和层序。二叉树中前序是根-左-右,中序是左-根-右,后序是左-右-根,层序按层访问。N 叉树通常保留前序、后序和层序,中序没有统一定义。
C++ 中 auto_ptr 和 shared_ptr 有什么区别?
C++ 中 auto_ptr 和 shared_ptr 有什么区别?这道腾讯牛客题的关键是围绕“auto_ptr 与 shared_ptr 所有权语义”讲清概念、机制、取舍和边界。auto_ptr 和 shared_ptr 的核心差异是所有权语义。auto_ptr 拷贝会转移所有权,源指针变空,语义危险且已废弃并从现代 C++ 移除;shared_ptr 使用控制块和引用计数共享所有权,最后一个引用释放时删除对象。
C++11 有哪些常用新特性?
C++11 有哪些常用新特性?这道腾讯牛客题的关键是围绕“C++11 常用新特性与解决的问题”讲清概念、机制、取舍和边界。C++11 的常用新特性包括 auto、range-for、lambda、右值引用和移动语义、智能指针、nullptr、constexpr、线程库、统一初始化和 unordered 容器。回答时要说这些特性分别解决什么问题。
同公司岗位有 2 条面经记录
如何判断单链表是否有环?
如何判断单链表是否有环?这道腾讯牛客题的关键是围绕“链表判环与快慢指针”讲清概念、机制、取舍和边界。判断链表是否有环,常用 Floyd 快慢指针。慢指针每次走一步,快指针每次走两步;如果链表有环,快指针最终会在环内追上慢指针;如果无环,快指针会先走到 null。
为什么数据库索引常用 B+ 树,B 树、B+ 树和二叉树有什么区别?
为什么数据库索引常用 B+ 树,B 树、B+ 树和二叉树有什么区别?这道腾讯牛客题的关键是围绕“数据库索引为什么常用 B+ 树”讲清概念、机制、取舍和边界。数据库索引常用 B+ 树,是因为它适合磁盘页和范围查询。B+ 树分叉多、树高低,非叶子节点只存 key 和子页指针,叶子节点顺序保存数据或主键并通过链表相连,能减少随机 I/O 并高效范围扫描。
二叉树有哪些基本性质和特点?
二叉树有哪些基本性质和特点?这道腾讯牛客题的关键是围绕“二叉树基本性质”讲清概念、机制、取舍和边界。二叉树每个节点最多有两个孩子,可分为普通二叉树、满二叉树、完全二叉树、平衡二叉树和二叉搜索树等。常见性质包括第 i 层最多 2^(i-1) 个节点,深度为 h 的二叉树最多 2^h-1 个节点。
平衡二叉树失衡后如何通过旋转恢复平衡?
平衡二叉树失衡后如何通过旋转恢复平衡?这道腾讯牛客题的关键是围绕“平衡二叉树旋转维护”讲清概念、机制、取舍和边界。平衡二叉树常以 AVL 为例,要求任一节点左右子树高度差不超过 1。插入或删除导致失衡后,根据 LL、RR、LR、RL 四种情况做单旋或双旋恢复平衡。
快速排序的过程、时间复杂度和常见优化方式是什么?
快速排序的过程、时间复杂度和常见优化方式是什么?这道腾讯牛客题的关键是围绕“快速排序流程与优化”讲清概念、机制、取舍和边界。快速排序的过程是选 pivot,执行 partition,把小于 pivot 的元素放左侧、大于 pivot 的元素放右侧,然后递归排序左右子区间。平均时间 O(n log n),最坏 O(n^2),递归栈平均 O(log n)。
C++ 命名空间的作用和使用方式是什么?
C++ 命名空间的作用和使用方式是什么?这道腾讯牛客题的关键是围绕“C++ 命名空间的作用和使用方式”讲清概念、机制、取舍和边界。C++ 命名空间用于组织符号并避免命名冲突。库、业务模块和第三方依赖都可能定义同名类或函数,把它们放在不同 namespace 下,可以通过限定名明确访问。
什么是平衡二叉树,如何实现基本的平衡维护?
什么是平衡二叉树,如何实现基本的平衡维护?这道腾讯牛客题的关键是围绕“平衡二叉树旋转维护”讲清概念、机制、取舍和边界。平衡二叉树常以 AVL 为例,要求任一节点左右子树高度差不超过 1。插入或删除导致失衡后,根据 LL、RR、LR、RL 四种情况做单旋或双旋恢复平衡。
数据库索引有哪些常见类型,它们有什么区别?
数据库索引有哪些常见类型,它们有什么区别?这道腾讯牛客题的关键是围绕“数据库索引类型”讲清概念、机制、取舍和边界。数据库索引类型可以按约束和结构分类:主键索引、唯一索引、普通索引、联合索引、前缀索引、全文索引、空间索引;InnoDB 还要区分聚簇索引和二级索引。
进程和线程有什么区别?
进程和线程有什么区别?这道腾讯牛客题的关键是围绕“进程与线程区别及上下文切换”讲清概念、机制、取舍和边界。进程是资源拥有和隔离单位,线程是同一进程内的调度执行单位。同一进程的线程共享地址空间、堆、全局变量和文件描述符,但有独立栈、寄存器上下文、线程局部存储和调度状态。
epoll 的 EPOLLONESHOT 是什么,适用于什么场景?
epoll 的 EPOLLONESHOT 是什么,适用于什么场景?这道腾讯牛客题的关键是围绕“epoll EPOLLONESHOT”讲清概念、机制、取舍和边界。EPOLLONESHOT 表示某个 fd 上的事件被触发并返回一次后,内核会临时禁用这个 fd 的后续事件通知。应用处理完当前事件后,需要用 epoll_ctl 的 EPOLL_CTL_MOD 重新 armed,才能再次收到通知。
Linux 下如何查看进程状态?
Linux 下如何查看进程状态?这道腾讯牛客题的关键是围绕“Linux 进程状态与 ps 输出”讲清概念、机制、取舍和边界。Linux 常见进程状态包括 R 运行或可运行、S 可中断睡眠、D 不可中断睡眠、T 停止、Z 僵尸。ps aux 还能看到 USER、PID、%CPU、%MEM、VSZ、RSS、TTY、STAT、START、TIME、COMMAND 等字段。
Linux 下如何查看一个进程打开了哪些文件?
Linux 下如何查看一个进程打开了哪些文件?这道腾讯牛客题的关键是围绕“查看进程打开文件”讲清概念、机制、取舍和边界。Linux 查看进程打开了哪些文件,常用 lsof -p PID,或 ls -l /proc/PID/fd。输出里不仅有普通文件,也包括 socket、pipe、eventfd、anon_inode 和已删除但仍被占用的文件。
Linux 下如何终止一个进程?
Linux 下如何终止一个进程?这道腾讯牛客题的关键是围绕“Linux 终止进程”讲清概念、机制、取舍和边界。Linux 终止进程通常先用 kill -TERM PID 发送 SIGTERM,让进程有机会优雅退出;无响应时再考虑 kill -KILL 或 kill -9。也可用 pkill/killall 按名称发送信号。
GDB 调试其他进程时为什么能读取其状态和内存信息?
GDB 调试其他进程时为什么能读取其状态和内存信息?这道腾讯牛客题的关键是围绕“GDB attach 与 ptrace 权限”讲清概念、机制、取舍和边界。GDB 调试其他进程能读取其状态和内存,核心依赖操作系统提供的 ptrace 调试接口。gdb attach 到目标进程后,内核会暂停目标进程,并允许调试器读取寄存器、内存和映射信息。
数组和链表有什么区别?
数组和链表都是线性表,但底层组织方式不同:数组用连续内存存放元素,链表用离散节点通过引用连接。这个差异决定了数组随机访问快、缓存友好,但插入删除和扩容成本可能高;链表插入删除在已定位节点时很快,但查找慢、缓存局部性差、额外指针开销大。工程上不能只背复杂度,要说明复杂度成立的前提,并结合 Java 的 ArrayList 和 LinkedList 对照。
同题还出现在 1 个公司岗位
编译器中的 AST 和词法分析分别是什么?
编译器中的 AST 和词法分析分别是什么?这道腾讯牛客题的关键是围绕“编译器词法分析、语法分析与 AST”讲清概念、机制、取舍和边界。词法分析负责把源代码字符流切分成 token,例如关键字、标识符、数字、运算符和分隔符;AST 是语法分析后得到的抽象语法树,保留程序结构和语义相关节点,通常会省略括号、分号等纯语法细节。
为什么线程上下文切换的开销通常小于进程上下文切换?
为什么线程上下文切换的开销通常小于进程上下文切换?这道腾讯牛客题的关键是围绕“进程与线程区别及上下文切换”讲清概念、机制、取舍和边界。进程是资源拥有和隔离单位,线程是同一进程内的调度执行单位。同一进程的线程共享地址空间、堆、全局变量和文件描述符,但有独立栈、寄存器上下文、线程局部存储和调度状态。
C++ 的继承机制有哪些类型和访问控制规则?
C++ 的继承机制有哪些类型和访问控制规则?这道腾讯牛客题的关键是围绕“C++ 继承类型与访问控制”讲清概念、机制、取舍和边界。C++ 继承包括单继承、多继承和虚继承;继承访问控制有 public、protected、private,决定基类 public/protected 成员在派生类中的可见级别。
C++ 运行时多态如何确定调用哪个派生类函数?
C++ 运行时多态如何确定调用哪个派生类函数?这道腾讯牛客题的关键是围绕“C++ 运行时多态派发”讲清概念、机制、取舍和边界。C++ 运行时多态通过虚函数实现:通过基类指针或引用调用 virtual 函数时,运行时根据对象的动态类型查虚函数表,调用最终覆盖的派生类函数。
进程、线程和协程有什么区别?
这道题本质是在考操作系统并发模型的分层理解:进程是资源隔离和资源分配的基本单位,线程是内核调度和 CPU 执行的基本单位,协程是用户态组织异步流程的轻量执行单元。面试时不能只背“进程重、线程轻、协程更轻”,要讲清地址空间、调度权、上下文切换成本、通信方式,以及在 I/O 密集、高并发服务中的取舍。
同题还出现在 1 个公司岗位
如何判断 SQL 查询是否发生索引失效?
如何判断 SQL 查询是否发生索引失效?这道腾讯牛客题的关键是围绕“SQL 索引失效判断”讲清概念、机制、取舍和边界。判断索引是否失效,核心看 EXPLAIN 或 EXPLAIN ANALYZE:possible_keys 有候选但 key 为空、type 退化为 ALL/index、rows 明显变大、filtered 很低、Extra 出现 Using filesort/Using temporary,通常说明没有按预期用上索引或扫描代价过高。
std::vector、std::list 和 std::map 的底层结构有什么区别?
std::vector、std::list 和 std::map 的底层结构有什么区别?这道腾讯牛客题的关键是围绕“std::vector、std::list 与 std::map 底层结构”讲清概念、机制、取舍和边界。std::vector 是连续动态数组,std::list 是双向链表,std::map 通常是红黑树这类自平衡有序树。三者的差异不只是 API,而是随机访问、插入删除、范围查询、内存局部性和迭代器失效规则不同。
C++11 中智能指针相关的新特性是什么?
C++11 中智能指针相关的新特性是什么?这道腾讯牛客题的关键是围绕“C++11 智能指针新特性”讲清概念、机制、取舍和边界。C++11 引入并标准化了 unique_ptr、shared_ptr、weak_ptr、make_shared 等智能指针能力,用 RAII 表达资源所有权,替代危险的 auto_ptr 拷贝转移语义。
std::vector::resize 的作用是什么,它如何影响 size、capacity 和元素构造?
std::vector::resize 的作用是什么,它如何影响 size、capacity 和元素构造?这道腾讯牛客题的关键是围绕“std::vector::resize 与容量管理”讲清概念、机制、取舍和边界。std::vector::resize 改变的是 size,也就是逻辑元素个数;如果变大,会构造新增元素,必要时扩容并迁移原有元素;如果变小,会析构多余元素,但通常不会保证缩小 capacity。它和 reserve 只调整容量不同。
C++ 智能指针为什么能避免内存泄漏?
C++ 智能指针为什么能避免内存泄漏?这道腾讯牛客题的关键是围绕“C++ 智能指针与内存泄漏治理”讲清概念、机制、取舍和边界。智能指针通过 RAII 把堆对象生命周期绑定到对象析构,能减少忘记 delete、异常路径提前返回和重复释放导致的问题。unique_ptr 表达独占所有权,shared_ptr 表达共享所有权,weak_ptr 用来观察对象并打破 shared_ptr 循环引用。
Linux 文件系统的基本存储结构是什么?
Linux 文件系统的基本存储结构是什么?这道腾讯牛客题的关键是围绕“Linux 文件系统存储结构”讲清概念、机制、取舍和边界。Linux 文件系统基本存储结构包括 superblock、inode、dentry、data block、inode/block bitmap、journal 和 page cache。目录项把文件名映射到 inode,inode 保存权限、大小、时间戳和数据块索引,data block 保存文件内容。
进程间和线程间分别有哪些同步方式?
进程间和线程间分别有哪些同步方式?这道腾讯牛客题的关键是围绕“线程同步与进程同步方式”讲清概念、机制、取舍和边界。线程同步发生在同一进程共享地址空间内,常用 mutex、rwlock、condition variable、semaphore、barrier、atomic 和 futex;进程同步跨地址空间,常用命名信号量、文件锁、共享内存配进程共享 mutex、管道、消息队列和 socket。
MCP 的传输层有哪些方式,stdio 和 Streamable HTTP 分别适合什么场景?
这题考 MCP 的通信协议和传输层取舍,回答重点是 MCP 定义的是客户端、服务器和工具的上下文协议,传输上要区分本地 stdio、当前远程 Streamable HTTP,以及旧 HTTP+SSE 的历史或兼容语境。
LLM 推理中 Continuous Batching 和 Prefix Caching 如何影响请求切分、batch 维度和吞吐/延迟取舍?
这题考 LLM 推理调度中的 Continuous Batching 和 Prefix Caching,回答重点是请求在 prefill/decode 阶段如何切分、按什么维度组 batch,以及吞吐和延迟如何取舍。
LLM 训练或推理中 FP8 和 BF16 如何按吞吐、显存和稳定性取舍?
这题考 LLM 训练或推理中 FP8 和 BF16 的精度格式取舍,回答重点是显存、带宽、吞吐、数值稳定性和工程校准,不应断言所有 DeepSeek 或 Qwen 版本的内部实现。
LLM 推理算子优化中,Memory Coalescing 和 Bank Conflict 分别是什么,如何影响显存访问效率?
这题考 CUDA 访存优化在 LLM 推理算子里的基本功。回答要把 GMEM 的连续合并访问、SMEM 的 bank 并行访问、warp 级访问模式和 profiling 现象连起来,而不是只背两个定义。
LLM 推理算子中,Tensor Core、WMMA 和 MMA 分别是什么,工程上如何选择使用层级?
这题考候选人是否理解 NVIDIA GPU 矩阵乘加的硬件、CUDA C++ 抽象和更底层指令接口。回答要能说明 Tensor Core 是硬件单元,WMMA 是较高层 CUDA API,MMA 是更贴近指令和 PTX 的矩阵乘加操作。
LLM 推理算子变慢时,如何判断瓶颈是 Memory Bound 还是 Compute Bound?
这题考算子性能诊断方法。回答要从理论 roofline、算术强度、实际 profiler 指标、stall reason 和优化方向闭环判断,而不是只说“看 GPU 利用率”。
单机多卡 LLM 推理中的分布式 GEMM 如何切分矩阵,并完成跨 GPU 通信?
这题考 tensor parallel 下 GEMM 切分和 collective communication 的基本工程理解。回答要能把矩阵维度切分、局部计算、AllReduce/AllGather/ReduceScatter、通信计算重叠和推理场景约束讲清楚。
LLM 推理服务如何做流量调度,兼顾模型副本、队列长度、KV 资源和延迟 SLO?
这题考 LLM 推理服务的请求路由和服务治理。回答要围绕模型副本选择、prefill/decode 队列、KV cache 资源、batching、优先级、SLO 和故障降级展开,避免泛泛而谈负载均衡。
LLM 长上下文推理中,KV Cache 压缩如何降低显存占用,和 Prefix Cache 的作用有什么区别?
这题考长上下文 LLM 推理中的显存管理。回答要把 Prefix Cache 的跨请求前缀复用和 KV Cache 压缩的单次/多次请求显存降载区分开,再说明压缩策略、精度损失、服务集成和评估指标。
AI Infra 中拿到一个慢算子时,如何判断是否值得优化,并选择 kernel 优化、算子融合、图优化或数据布局调整?
这题考慢算子优化的工程决策树,重点不是单独判断 Memory Bound 或 Compute Bound,而是先判断投入是否值得,再把 profile 证据映射到 kernel、融合、图优化和 layout 等不同路径。
接手一个未量化的大模型时,如何推进量化方案选择、校准、精度评估和推理性能迭代?
这题考未量化大模型的量化 rollout 方法论,重点是从部署目标、量化范围、校准集、kernel 支持、质量回归、性能收益到灰度回滚形成闭环,而不是背几个量化名词。
同题还出现在 1 个公司岗位
AWQ 等权重量化引入反量化步骤后,为什么仍可能让 LLM 推理整体变快?
这题考权重量化的反直觉加速机制,核心是解释额外 dequant 计算为什么可能小于权重带宽、显存占用、cache 命中和融合带来的收益,同时说明它只在合适瓶颈和 kernel 支持下成立。
推理优化中为什么常把动态图转成静态图再做算子融合,转换开销如何评估和控制?
这题考动态图和静态图在推理优化中的取舍,重点是静态图提供全局依赖、shape、pattern 和内存信息,便于融合和调度优化;转换开销要靠缓存、shape bucketing、warmup、fallback 和端到端摊销控制。
把 FP16 权重量化为 INT8 并保留 FP32 scale 时,scale factor 如何计算,为什么常用绝对值最大值定标?
这题考权重量化的基础闭环:从 FP16 到 signed INT8 的映射、scale 的计算、absmax 定标的原因、反量化误差,以及 per-tensor/per-channel 和 outlier 取舍。
手写 CUDA vector add kernel 时,为什么需要边界判断,为什么通常不用 shared memory,block size 和 warp 有什么关系?
这题考 CUDA 入门 kernel 的工程基本功:线程索引、越界保护、全局内存合并访问、shared memory 是否有复用收益、block size 与 warp/occupancy 的关系。
非对称量化相比对称量化,在计算和反量化时会带来哪些额外开销与精度影响?
这题考 zero point 带来的计算差异。好答案要从量化公式展开到矩阵乘额外修正项、预计算可能性、性能代价,以及非零中心分布下的精度收益。