如何解决缓存局部性方面的数据存储效率
我想做一个像这样的数据存储:
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));
// 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 举报,一经查实,本站将立刻删除。