问题描述
我想做一个像这样的数据存储:
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 (将#修改为@)