【发布时间】:2017-01-29 11:03:32
【问题描述】:
假设缓存行大小为 64 字节,并且我有一个大小也是 64 字节的对象。如果这个对象被访问,会是:
- 全部加载到一个缓存行中
- 仅加载对象开头和下一个 64 字节的倍数之间的部分
- 对象将被加载到两个不同的缓存行中
- 别的东西
我感觉答案因处理器而异,但现代 CPU 最可能的结果是什么?
【问题讨论】:
假设缓存行大小为 64 字节,并且我有一个大小也是 64 字节的对象。如果这个对象被访问,会是:
我感觉答案因处理器而异,但现代 CPU 最可能的结果是什么?
【问题讨论】:
当涉及到机器指令级别时,高级语言中可用的对象概念就消失了。通过更高级别的分配操作访问其成员将被转换为常规的读写指令。因此,如果运行时系统或语言的虚拟机是智能的并且能够分配对象以获得更好的缓存利用率,在您的情况下,当高级语言读取对象的任何成员时,分配到 64 字节对齐的地址,这可能在 64 字节对齐地址内的任何位置,整个对象将被加载到缓存线(因为它分配在 64 字节对齐地址)。如果运行时系统是愚蠢的,如果它只是按照程序流程中的请求分配对象,而不像您的问题中提到的那样调查情况(64 字节对象和 64 字节缓存行),那么当读取发生在对象,该成员的 64 字节对齐地址处的数据将被加载到缓存中。因此,在后一种情况下,您需要幸运或编写代码,以便在对象的前面或后面设置特殊填充以使其缓存行对齐。
【讨论】: