我一直在阅读 Ulrich Drepper 的 "程序员应该了解的关于内存的知识",在 3.3.2 缓存效应的测量(页面中部)一节中,给我的印象是访问结构体的任何成员都会导致整个结构体被拉入 CPU 缓存。
这是正确的吗?如果是这样,硬件如何知道这些结构体的布局?或者编译器生成的代码是否会强制加载整个结构体?
还是使用较大结构体时的减速主要是由于结构体分散在更多内存页上引起的 TLB 未命中?
Drepper 使用的示例结构体是:
struct l {
struct l *n;
long int pad[NPAD];
};
当NPAD
等于0、7、15或31时,sizeof(l)
由此确定,导致结构体之间相隔0、56、120和248字节,并假设缓存行为64字节和4k页面。
即使实际上只访问指针,但随着结构体的增长,仅仅迭代遍历链表也会显著变慢。