gpt4 book ai didi

c++ - 有多少 "large"对象被带入缓存?

转载 作者:行者123 更新时间:2023-11-30 01:17:45 26 4
gpt4 key购买 nike

如果我有一个包含多个大 vector 的对象,如果我访问其中一个 vector 数据成员是否意味着其他 vector (我还没有访问过)也被带入缓存(可能是根据空间局部性规则代码)?

如果我有:

class A{
float p;
int x[10000];
int y[10000];
};

我只是在一段特定的代码中访问p,访问A::p会比

更污染缓存
class B{
float p;
int x[10000];
double y;
};

因为 B 由于只有一个大数组而较小。

我的直觉是只加载经常访问的缓存行,而不是整个对象。

最佳答案

正如其他答案中提到的,内存子系统不知道对象的内存布局。它只看到对相应地址的内存访问。因此,无论您的对象有多大,都会始终将相同数量的数据加载到缓存中。

至于加载多少数据的问题,这个要看架构。在简单系统上,只会加载相应的缓存行。另一方面,现代 x86 cpu 也有预取机制。该机制会尝试确定您接下来最有可能需要的内存地址,并且还会提前获取这些缓存行。这就是顺序访问比随机访问快得多(数量级)的原因,因为这里预取器将始终选择正确的数据。

编辑:但同样:这与您的类的大小无关,而仅取决于访问模式(当然这可能取决于您的类的内存布局)。

关于c++ - 有多少 "large"对象被带入缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23705650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com