【发布时间】:2014-07-05 12:27:03
【问题描述】:
如果我有一个包含多个大向量的对象,如果我访问其中一个向量数据成员,是否意味着其他向量(我没有访问过)也被带入缓存(可能通过空间局部性规则代码)?
如果我有:
class A{
float p;
int x[10000];
int y[10000];
};
而我只是在一段特定的代码中访问p,访问A::p 对缓存的污染比
class B{
float p;
int x[10000];
double y;
};
因为B 只有一个大数组,因此更小。
我的直觉是只加载经常访问的缓存行,而不是整个对象。
【问题讨论】:
-
缓存行为取决于机器。如果您加载一块内存,则周围的内存也可能会被缓存,但是被缓存的内存大小与您的结构的外观无关,因为您的机器不知道结构是什么并且不在乎你认为它的成员属于一起。
-
高速缓存行有一定的大小——可能是 128 字节。如果必须访问该行中的任何字节,则引入整行(甚至是不相关对象中的字节)。在最简单的缓存方案中,在引用之前不会引入额外的字节。
-
只是评论:您在谈论向量,但您的示例使用 c 数组。这对答案没有影响,但就内存布局而言,这是完全不同的两件事。向量在堆上的单独内存区域管理它们的内存,而 c 数组的变量实际上是在对象内存区域内分配的。
标签: c++ performance caching cpu cpu-architecture