编译器优化时需要考虑
- 是否发生“内存别名引用”:我们把多个指针使用同个内存位置的情况称为内存别名引用
- 是否发生函数调用
函数调用例子:
局部性原理
局部性是使计算机更加“友好工作”的主要因素
- 时间局部性(Temporal Locality): 如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。程序循环、堆栈等是产生时间局部性的原因。
- 空间局部性(Spatial Locality): 在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的
- 顺序局部性(Order Locality): 在典型程序中,除转移类指令外,大部分指令是顺序进行的。指令的顺序执行、数组的连续存放等是产生顺序局部性的原因。
缓存未命中
- 强制性失效:当第一次访问,在缓存中没有对应数据时,就叫强制性失效
- 冲突失效:在直接相联或组相联的缓存中,不同的缓存块由于索引相同相互替换,引起的失效叫做冲突失效
- 容量失效:有限的缓存容量导致缓存放不下而被替换,被替换出去的缓存块再被访问,引起的失效叫做容量失效
组相联高速缓存
寻找过程:
首先高速缓存必须搜索组中的每一行, 寻找一个有效的行,其标记与地址中的标记相匹配 。如果高速缓存找到了这样一行(命中),通过块偏移索引到具体位置。