字节跳动客户端一面面经(深圳产品架构部)

字节跳动客户端一面

  • C++
    • static放在头文件中会怎样
    • 构造、析构函数
    • 虚函数、虚表
    • lambda函数
    • 函数对象(重载()运算符)
    • 预处理
  • 计算机网络
    • http中输入url后的完整过程
    • TCP三次握手、流量控制、拥塞控制
  • 操作系统
    • 动态、静态链接库
  • 算法题
    • 按摩师

C++

static放在头文件中会怎样

static的一个重要作用是隐藏,用于将变量或者函数的可见域限定在当前文件中,其他文件不可见。
static变量或者方法如果声明在头文件中,那么在调用头文件时,对于同一个static变量,实际上会产生多个互不相干的static变量,无法达到数据共享的效果,所以一般也不建议将static声明在头文件中

构造、析构函数

执行顺序:父类构造——>子类构造——>子类析构——>父类析构

虚函数、虚表

  • 虚函数:用于C++多态中的动态绑定,关键字是virtual
  • 虚表:每个含有虚函数的类都有一个虚表,虚表中保存的就是虚函数的地址
  • 抽象类:含有纯虚函数的类叫做抽象类,抽象类不能实例化,只能等子类实现纯虚函数
  • 虚析构函数:一般将父类的析构函数声明为虚析构函数,这样是为了防止对象在离开作用域时发生内存泄漏
  • 虚构造函数:不允许。网上一个很普遍的解释是这样的:虚函数相应一个指向vtable虚函数表的指针,但是这个指向vtable的指针实际上是存储在对象的内存空间的。假设构造函数是虚的,就必须通过vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。

lambda函数

C++11的新特性,匿名函数,这篇博客解释得很详细

函数对象(重载()运算符)

参考

预处理

发生在词法分析等之前,以#开头,一般用于包含头文件、宏展开#define、条件编译#ifdef等

计算机网络

http中输入url后的完整过程

首先是在本地缓存中查找是否有对应的缓存,如果有,则直接连接开始通信。如果没有:

  • 域名解析(DNS协议)
  • 层级查找(树状)
  • 建立TCP连接(三次握手)
  • 发送请求(get、post等)
  • 获取html数据资源
  • 加载资源和渲染

TCP三次握手、流量控制、拥塞控制

  • TCP三次握手:客户端发送一个请求号SYN=m,服务端回应一个确认号ACK=m+1并且返回一个请求号SYN=n,客户端返回一个确认号ACK=n+1。
  • 流量控制:滑动窗口机制
  • 拥塞控制:慢开始、拥塞避免、快重传、快恢复

操作系统

动态、静态链接库

静态链接库会把lib文件中用到的函数代码链接进目标程序中,程序运行时不再需要静态库文件;
动态链接库只是把dll中的被调用函数的位置等信息链接进目标程序,程序运行时再从dll中寻找相应的代码;

算法题

按摩师

巧的是,面试前几天正好有在leetcode上看到过这个题,只不过自己没看解答也没做,好在难度不高,现场手撕出来了,思路就是简单dp

你可能感兴趣的:(字节跳动客户端一面面经(深圳产品架构部))