C/ C++ 的数据、代码及内存
多字节值, 字节序
cpu 存储以字节为单位
小端存储字节信息和阅读顺序相反
英特尔 CPU 是小端的,主机上是大端
翻译单元
编译器每次编译一个翻译单元
链接器组合所有翻译单元成为最终执行文件
可执行映像
代码段
数据段
BBS 段
只读数据段
堆栈帧
返回地址
寄存器
局部变量
对齐和包裹
数据承成员有其天然的对齐方式
通常是 4 字节对齐
注 : GPU 需要 16 字节对齐
在结构体上写上 u8 _pad 来明确填充的字节
C++ 的内存布局
C++ 中 struct 和 class 的区别只在于预设成员的可见性
虚函数的实现, 类中多一个虚函数指针指向该类对应的虚函数表
虚函数表有函数的条目,指向该类里函数的具体实现
错误
用户错误 : 可以被程序妥善处理并继续运行
程序员错误 :不可以继续运行程序, 正式发布时应该避免所有的程序员错误。没法避免时,需要将程序员错误转换为用户错误
流水线、缓存及优化
底层的优化方案是更多 cpu 工作,减少内存访问
访问内存需要几千个处理器周期
高速内存 :缓存 (cache)
缓存命中,几十周期,缓存命中失败,几千周期
缓存命中失败后, 加载内存中数据时,把附近的区域全部载入并填满缓存
多核多级缓存架构
缓存展现出需要一致性,在没读取出来的时候不需要一致
避免缓存命中失败
用循环代替跳转
循环代码块中的代码越少越好,有利于全部加入 cache
循环中减少函数调用,用内联,但是内联用的多了可能导致过大代码片段没法加入 cache
指令在 cpu 中流动 :
读取,解码,执行,内存,回写寄存器
延迟 latency, 带宽 bandwidth, 吞吐量 throughput
数据依赖(data dependency), 导致流水线停顿(stall)
最后更新于