快手C++ 一面 面经
1. 介绍一下你做过的项目,重点说说技术难点 (15min)
答案要点:
- 选择1-2个最有技术含量的项目深入讲解
- 强调:性能瓶颈分析、内存优化、多线程并发、崩溃率降低
- 用数据说话:启动速度提升40%、内存占用降低30%、崩溃率从2%降到0.5%
- 准备追问:为什么这么设计?有没有考虑其他方案?如何权衡的?
2. 智能指针有哪几种?shared_ptr的实现原理
智能指针类型:
unique_ptr:独占所有权,不可拷贝只能移动shared_ptr:共享所有权,引用计数管理weak_ptr:弱引用,解决循环引用问题auto_ptr:已废弃(C++11)
shared_ptr实现原理:
template<typename T>
class shared_ptr {
private:
T* ptr;
int* ref_count; // 引用计数
public:
shared_ptr(T* p) : ptr(p), ref_count(new int(1)) {}
// 拷贝构造
shared_ptr(const shared_ptr& other)
: ptr(other.ptr), ref_count(other.ref_count) {
(*ref_count)++;
}
// 析构函数
~shared_ptr() {
if (--(*ref_count) == 0) {
delete ptr;
delete ref_count;
}
}
T* operator->() { return ptr; }
T& operator*() { return *ptr; }
};
关键点:
- 控制块包含:引用计数、弱引用计数、删除器
- 线程安全:引用计数的增减是原子操作
- 循环引用问题:A持有B的shared_ptr,B持有A的shared_ptr,需要用weak_ptr打破
3. 进程间通信方式有哪些?
常见IPC方式:
- 管道(Pipe)半双工,只能单向通信只能用于父子进程或兄弟进程
- 命名管道(FIFO)可用于无亲缘关系进程以文件形式存在于文件系统
- 消息队列(Message Queue)消息链表,存放在内核中可以实现消息的随机查询
- 共享内存(Shared Memory)最快的IPC方式需要配合信号量进行同步
- 信号量(Semaphore)主要用于进程同步P/V操作实现互斥访问
- 套接字(Socket)可用于不同机器间通信支持网络通信
- 信号(Signal)用于通知进程某个事件发生异步通信方式
4. 说说C++的多态,虚函数表是什么?
多态类型:
- 编译时多态:函数重载、模板
- 运行时多态:虚函数
虚函数表(vtable):
class Base {
public:
virtual void func1() { cout << "Base::func1" << endl; }
virtual void func2() { cout << "Base::func2" << endl; }
};
class Derived : public Base {
public:
void func1() override { cout << "Derived::func1" << endl; }
virtual void func3() { cout << "Derived::func3" << endl; }
};
内存布局:
Base对象: +-------------------+ | vptr (虚函数表指针) | +-------------------+ Base的vtable: +-------------------+ | &Base::func1 | | &Base::func2 | +---
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。
查看1道真题和解析