缓存局部性方面的数据存储效率

问题描述

我想做一个像这样的数据存储:

  1. 我有一个结构数组,它们是某种智能指针。每个指针包含有关堆栈数组(包含所有对象的存储)中对象的位移、对象大小和持有者数量的信息:
struct ObjPtr {
    int disp;  // displacement
    int size;  // size of an object
    int count; // number of holders
}

// somewhere in code...
// Assume I can create only 1024 objects just for example.
ObjPtr* smart_pointers = (ObjPtr*)calloc(1024,sizeof(ObjPtr)); 
  1. 我有一个包含所有对象的堆栈数组:
// Assume 64 MB is enough
char* obj_stack = (char*)calloc(64 * 1024 * 1024,sizeof(char))
int stack_top; // displacement of the top of the obj_stack

它只是一个普通的字节数组。每个对象都在堆栈顶部分配,然后我们执行 stack_top += sizeof(allocated_type)。如果没有足够的内存,我们压缩 obj_stack完全无处不在在我的程序中我如何使用ObjPtr数组中smart_pointers索引而不是指针:

// Access an object:
SomeObject* some_object = (SomeObject*)(obj_stack + pointers[objPointer_index].disp)

请注意,我从诸如如何压缩堆栈、堆栈上的对象对齐、如何存储释放的智能指针的索引、计数器递增/递减的原子性、循环引用、智能指针的内存开销等问题中抽象出来,访问对象等期间的性能开销。

我害怕的问题是: 据我了解虚拟内存的工作原理,处理器不会从内存中检索几个字,而是尝试预测进一步的内存访问并加载更多内容并将其放入缓存。这称为局部性原则。我猜编译器提供的典型分配器试图保留局部性。这种存储的设计方式是将引用和对象存储在不同的页面上。这违反了局部性原则。但这是一个小问题。最大的问题是,从长远来看,经过多次压缩后,对象(一起工作,相互引用)可能会分布在整个堆栈数组中。所以我猜处理器会疯狂地从一页跳到另一页。这就像向量与链表缓存未命中。你怎么认为我的假设是正确的?我应该关心局部性和碎片化吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)