语言基础
extern和static关键字:
- 变量或函数作用范围声明(整个工程)。B模块extern变量会在链接阶段查本模块后文中的同名变量->其他模块的同名全局变量,调用。
- extern “C” 按照c语言规则编译
- 与static不同是,static只属于自身编译单元(cpp和包含的头文件)
- static变量是再编译期就被初始化,并不是首次执行
- 错误用法: extern int a = 1, 提前定义,被包含会二次定义。
- 点击推荐资料
volatile关键字:
- 保证每次读变量都是写入的最新值(每次从内存中读取)。禁止指令重排优化,仅保证可见性和有序性,不保证原子性。
- 机制:内存屏障。
- 多线程并发访问共享变量用volatile。
const 使用场景
- 参数传递(const 引用续命)
- const 成员函数
- const char* c_str()返回值
new 和 malloc 区别
- 都是堆上分配内存, 维护空闲内存链表。
- 操作符(可重载)/库函数
- 大小指定
- 构造和析构
- 扩展:stl使用的allocator内存分配器(二级管理) 大于128B, 小于128B按照8的倍数分级。
多态和虚函数表
- 编译时多态-重载函数/模板; 运行时多态-虚函数
虚函数表
- 虚函数指针存在于对象实例最前面(void**) 指向一个指针数组的指针 - 同一个类的不同实例共用一个虚函数表 - 子类单继承后也只有一个虚函数表,子类定义一个新虚函数,也只有一个虚函数表,并加在表末尾。 - 子类多继承有多个虚函数表 - 多继承,前面的基类没有虚函数,去掉这个基类虚函数表,地址置后。(谁有虚表谁前靠) - 所有基类都没有虚函数表,子类生成虚函数表并前置。 - 父类指针强制转换为子类指针,执行的还是父类函数。 - [点击推荐资料][2]
智能指针
shared_ptr(引用计数线程安全,但是对象需要加锁), 避免循环引用
- 计数器变化(拷贝使得对象计数+1, 赋值使得原对象计数-1,后来指向的对象引用计数加1,指向后来的对象)
unique_ptr
- 唯一拥有其所指对象,离开作用域销毁,不能赋值拷贝,只能移动或者释放转移所有权。
weak_ptr
- 不具有普通指针的行为,没有重载operator*和->, 不共享资源
- 从shared_ptr和weak_ptr构造
循环引用
- 一个类用shared_ptr,另一个类用weak_ptr。
c++ 四种类型转换(显式转换)
static_cast 非多态类型的转换
- 层次结构 向上造型安全,向下造型不安全。
- 基本数据类型
- 指针转换(不安全)
dynamic_cast
- 向下造型有类型检查(运行时确定,不安全返回null)
- 菱形继承存在造型不确定性,考虑是否有两个祖父节点的备份(虚继承)
- const_cast 修改常量指针或者引用
- 内存对齐的原则
- STL内存池
- 必须在构造函数初始化式里进行初始化的数据成员有哪些(常量,引用,对象)
- C++定位内存泄漏 valgrind(linux), _CrtDumpMemoryLeaks(windows)
网络
TCP和UDP的区别
- 有连接,无连接
- 可靠传输,不可靠传输
- 流模式 数据报模式
- 点对点/ 广播多播
- 确认,重传,拥塞控制。
TCP 三次握手四次挥手
- 保证可靠传输的最小次数(A发了一个延时,又发一个断开,B收到延时的,以为又连接了)
- 全双工,所以四次。
2MSL是什么状态?作用是什么?
- Time wait 状态, 主要怕ACK对方没收到,这样对方会重发一个FIN包,正好2MSL
- Nagle算法: 缓存数据包到指定大小或者收到应答包后发送。
- 超时重传: 定时器,未应答(可以是后面的包),再传。快重传:接收端没有收到期望包会对之前的包应答,超3次重传。
- TCP窗口,连续发送多个包。发送窗:已发送未应答+待发送。 接收窗:分配缓冲-已接受确认等待消耗。根据应答包的位置滑动。
- 拥塞避免算法:慢开始,拥塞避免,(快重传,快恢复)。
本文由 shinelin 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Apr 24, 2019 at 12:08 pm