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)

最后更新于