use*_*168 8 c++ heap memory-management defragmentation heap-fragmentation
我正在寻找一个自我碎片整理的内存管理器,其中一个简单的递增堆分配器与一个简单的压缩碎片整理程序结合使用.
粗略的方案是从最低内存地址开始向上分配块,并保持从最高内存地址开始向下工作的簿记信息.
内存管理器会传回智能指针 - boost的intrusive_ptr似乎对于簿记结构最为明显,这些结构本身会指向实际的内存块,从而提供一个间接级别,以便可以轻松地移动块.
碎片整理程序将从"生成"书签开始压缩堆,以加快进程并且一次只对固定数量的内存进行碎片整理.对块本身的原始指针在下一次碎片整理通过之前是有效的,因此可以自由传递直到这样的时间改善性能.
具体应用是控制台游戏编程,因此在每个帧的开始或结束时,可以相对安全地完成碎片整理传递.
所以我的问题是,任何人都使用这种分配方案与STL结合,它会让STL分开,因为我怀疑.我可以看到std :: list <intrusive_ptr>在intrusive_ptr级别工作,但是stl列表节点本身的分配是什么,无论如何都要覆盖next/prev指针为intrusive_ptr本身,或者我只需要有一个标准堆分配器旁边这个更动态的.
如果你要在内存中移动物体,那么你就无法完全做到这一点.只有知道可能会被移动的对象才能执行此操作.您还需要一个锁定机制.在对象上调用函数时,无法移动它.
原因是整个C++模型依赖于坐在内存中固定点的对象,因此如果一个线程在一个对象上调用一个方法,这个线程就会被暂停并且对象被移动,当线程恢复时,灾难就会发生.
任何持有原始内存指针的对象都可能被移动(包括其自身的子对象).
这样的内存管理方案可能有用,但你必须非常小心.您需要严格执行句柄和handle->指针锁定语义.
对于STL容器,您可以自定义分配器,但仍需要返回固定的原始内存指针.您无法返回可能移动的地址.因此,如果您正在使用STL容器,它们必须是句柄的容器,并且节点本身将是普通的动态分配内存.您可能会发现在句柄间接方面的开销太大,并且在句柄集合的碎片方面仍然存在问题,而不是使用STL获得的问题.
使用直接理解句柄的容器可能是前进的唯一方法,即使这样,与使用内存中固定的传统对象的C++应用程序相比,仍然可能存在很多开销.