C++ 后台开发一些面试题

in with 0 comment

语言基础

  1. extern和static关键字:

    • 变量或函数作用范围声明(整个工程)。B模块extern变量会在链接阶段查本模块后文中的同名变量->其他模块的同名全局变量,调用。
    • extern “C” 按照c语言规则编译
    • 与static不同是,static只属于自身编译单元(cpp和包含的头文件)
    • static变量是再编译期就被初始化,并不是首次执行
    • 错误用法: extern int a = 1, 提前定义,被包含会二次定义。
    • 点击推荐资料
  2. volatile关键字:

    • 保证每次读变量都是写入的最新值(每次从内存中读取)。禁止指令重排优化,仅保证可见性和有序性,不保证原子性。
    • 机制:内存屏障。
    • 多线程并发访问共享变量用volatile。
  3. const 使用场景

    • 参数传递(const 引用续命)
    • const 成员函数
    • const char* c_str()返回值
  4. new 和 malloc 区别

    • 都是堆上分配内存, 维护空闲内存链表。
    • 操作符(可重载)/库函数
    • 大小指定
    • 构造和析构
    • 扩展:stl使用的allocator内存分配器(二级管理) 大于128B, 小于128B按照8的倍数分级。
  5. 多态和虚函数表

    • 编译时多态-重载函数/模板; 运行时多态-虚函数
    • 虚函数表

      - 虚函数指针存在于对象实例最前面(void**) 指向一个指针数组的指针
      - 同一个类的不同实例共用一个虚函数表
      - 子类单继承后也只有一个虚函数表,子类定义一个新虚函数,也只有一个虚函数表,并加在表末尾。
      - 子类多继承有多个虚函数表
      - 多继承,前面的基类没有虚函数,去掉这个基类虚函数表,地址置后。(谁有虚表谁前靠)
      - 所有基类都没有虚函数表,子类生成虚函数表并前置。
      - 父类指针强制转换为子类指针,执行的还是父类函数。
      - [点击推荐资料][2]
  6. 智能指针

    • shared_ptr(引用计数线程安全,但是对象需要加锁), 避免循环引用

      • 计数器变化(拷贝使得对象计数+1, 赋值使得原对象计数-1,后来指向的对象引用计数加1,指向后来的对象)
    • unique_ptr

      • 唯一拥有其所指对象,离开作用域销毁,不能赋值拷贝,只能移动或者释放转移所有权。
    • weak_ptr

      • 不具有普通指针的行为,没有重载operator*和->, 不共享资源
      • 从shared_ptr和weak_ptr构造
    • 循环引用

      • 一个类用shared_ptr,另一个类用weak_ptr。
  7. c++ 四种类型转换(显式转换)

    • static_cast 非多态类型的转换

      • 层次结构 向上造型安全,向下造型不安全。
      • 基本数据类型
      • 指针转换(不安全)
    • dynamic_cast

      • 向下造型有类型检查(运行时确定,不安全返回null)
      • 菱形继承存在造型不确定性,考虑是否有两个祖父节点的备份(虚继承)
    • const_cast 修改常量指针或者引用
  8. 内存对齐的原则
  9. STL内存池
  10. 必须在构造函数初始化式里进行初始化的数据成员有哪些(常量,引用,对象)
  11. C++定位内存泄漏 valgrind(linux), _CrtDumpMemoryLeaks(windows)

网络

  1. TCP和UDP的区别

    • 有连接,无连接
    • 可靠传输,不可靠传输
    • 流模式 数据报模式
    • 点对点/ 广播多播
    • 确认,重传,拥塞控制。
  2. TCP 三次握手四次挥手

    • 保证可靠传输的最小次数(A发了一个延时,又发一个断开,B收到延时的,以为又连接了)
    • 全双工,所以四次。
  3. 2MSL是什么状态?作用是什么?

    • Time wait 状态, 主要怕ACK对方没收到,这样对方会重发一个FIN包,正好2MSL
  4. Nagle算法: 缓存数据包到指定大小或者收到应答包后发送。
  5. 超时重传: 定时器,未应答(可以是后面的包),再传。快重传:接收端没有收到期望包会对之前的包应答,超3次重传。
  6. TCP窗口,连续发送多个包。发送窗:已发送未应答+待发送。 接收窗:分配缓冲-已接受确认等待消耗。根据应答包的位置滑动。
  7. 拥塞避免算法:慢开始,拥塞避免,(快重传,快恢复)。
Responses