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

标签 c++ performance caching cpu cpu-architecture

如果我有一个包含多个大 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/

相关文章:

c++ - 将数据从工作线程发送到 Qt 中的 gui 线程

c++ - 尝试仅通过操作指针对链表进行排序

C# Web API - 在内存缓存中存储和持久化数据

database - 如何增加 Amazon RDS Aurora 数据库中的 MySQL 查询缓存?

android - WebView 和 GridView 变成 ScrollView,View 太大无法放入绘图缓存

c++ - 有没有办法检查此内存泄漏?

c++ - 运算符 > 重载不起作用

php - 在析构函数中取消设置对象属性是否更有效?

performance - Julia:稀疏矩阵的 View

scala - 如何使用范围编写高效的嵌套循环