【C/C++】【面经】2022 字节 提前批面经;( C++ 客户端)(更新:一面;二面;三面;)

本文记录了一次字节跳动C++客户端-教育方向的面试经历,涵盖了操作系统基础知识如虚拟内存、寻址方式、分页分段、系统中断,C++的智能指针、引用计数、循环引用,以及字母异位分组问题。面试官注重基础与实际应用,同时也讨论了客户端开发的相关技术和教育方向的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一面

【C/C++】【面经】2022 字节跳动( C++ 客户端-教育方向 )提前批面经

二面

OS
  • 虚拟内存与物理内存;他们的区别;内存的交换是啥
  • 寻址方式有哪些;(讲了一会页表映射,具体问题没有理解,可能没涉及到)
  • 分页分段;区别及其应用;(内外碎片…)
  • 系统中断的过程;(保存上下文、中断程序、恢复现场、调度)
  • 内核态的理解;(隔离,os 层面包装内存空间,限制用户程序)
C++
  • 智能指针每个讲一下;
  • 引用计数怎么设计;(引用构造都在什么时候加1)(深拷贝、浅拷贝,会引起引用计数加一吗?)
  • 写一下造成循环引用的代码;
  • map、unordered_map;实现区别、复杂度区别、空间区别;
手撕
  • 将下面的arr 分组位下面的arr2

面试完想起来其实就是字母异位分组的问题;

vector<vector<char>> arr= {{'a','b','c'},{'b','a'},{'a','c','b'},
						{'c','a','b'},{'A','B'},{'a','b'},{'B','A'}};                     
vector<vector<vector<char>>> arr2= 
{
{{'a','b','c'},{'a','c','b'},{'c','a','b'}}
{{'b','a'},{'a','b'}}
{{'A','B'},{'B','A'}}
};						
总结
  1. 这次的面试官给了我很大的发挥空间,让我自己讲的比较多;然后根据我讲的再挖深一些,总体比较友好;
  2. 也讲到了C++ 只是基础,如果真要去做客户端,需要重学语言与架构;

三面

闲聊
  • 你是电子的学生?课程和计算机有什么差异呢?
  • 有学过什么课程;
  • 自学的框架;
  • 什么时候准备转行的;
  • 对客户端有什么了解;做过相关工作吗?
  • 了解过什么客户端的项目;
  • 客户端的IOS 安卓有了解多少;
  • 怎么评价自己;
手撕+闲聊
  • linux了解多少、java了解吗;
  • IPV4、IPV6 了解多少;格式讲一下;
  • 手撕IPV6判断;(主要是针对一些测试用例的修改、比如:“0::0”)
闲聊一些基础
  • HTTP 的header 记得多少;
  • 2.0 和1.1 的区别;(头部压缩、二进制帧、并发传输、主动推送)
  • 常见状态码;206、200、500;
  • 线程池重用;
  • 并行并发;
  • 投的教育方向,对教育方向的了解;
  • 为什么想做互联网

反问:

  • K12政策问题的影响;(技术导向问题不大)
总结
  • 面试官很好,有引导,让自己讲解;整体面试过程很舒服;
### C++ 面试中的常见问题 #### 基类的析构函数为何要声明为虚函数? 当基类指针指向派生类对象并删除该指针时,如果基类的析构函数不是虚函数,则只会调用基类的析构函数而不会调用派生类的析构函数。这可能导致资源泄漏或其他未定义行为。因此,为了确保所有层次结构中的析构函数都能被正确调用,应该将基类的析构函数声明为虚函数[^1]。 #### C++ 的异常处理机制有何优点? C++ 的异常处理允许程序在遇到错误条件时不立即终止执行流程而是抛出异常给更高层来决定如何处理这些异常状况。这种分离使得底层代码专注于业务逻辑而不是复杂的错误检测与恢复工作;同时让高层能够集中管理不同类型的异常情形,提高了代码清晰度和维护性[^2]。 #### 指针和引用的区别是什么? - **生命周期**:指针可以为空(null),也可以重新赋值指向另一个地址;而引用一旦初始化就必须关联到某个有效变量,并且不能再改变所引用的对象。 - **操作符支持**:对于指针来说存在解引用(`*`)以及取址(&amp;)的操作符号;但是引用则不需要额外的操作符来进行访问因为它本身就是作为目标实体的一个别名。 - **内存开销**:通常情况下两者占用相同的字节数(取决于平台),不过由于编译器优化等原因实际表现可能会有所差异[^3]。 #### `new` 和 `delete` 如何实现?它们与 `malloc` 及 `free` 有什么异同? - **相同点**:都是用于分配/释放动态存储空间的方法,在堆区创建对象实例或者数组。 - **不同之处**: - `new/delete` 是运算符而非库函数形式; - 使用 `new` 创建对象会自动调用相应的构造函数完成初始化过程,同样销毁时也会触发对应的析构函数清理资源; - 对象类型安全检查更为严格——即通过 `new T[]` 形式的表达式申请多维数组时能保留维度信息供后续使用; - 支持自定义配置参数如对齐方式等高级特性. #### 结构体(struct) 和 类(class) 主要有哪几个方的差别? 主要体现在默认访问权限上: - Struct 默认成员是 public 访问级别,默认继承也是公有的(public); - Class 则相反,默认私有(private), 私密程度较高一些; 除此之外二者语法几乎完全一致,都可以拥有数据成员、方法成员(含静态成员)、友元声明等等. ```cpp struct Point { int x; // Public by default for structs. }; class Rectangle { private: float width_; // Private by default for classes. public: void setWidth(float w){width_ = w;} }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值