我想写一个自我整理存储管理由此使一个简单的递增堆分配器结合使用一个简单的压碎片整理程序。

粗糙的方案将分配区块开始在最低的存储地址的去向,并保持记录的信息开始,在最高的存储地址的工作是向下的。

存储管理会通过的明智的指针提升的intrusive_ptr似乎最明显的簿记结构,然后将自己点实际存块从而使一个级别的间接使块可以很容易地移动。

的碎片整理会紧凑的下堆开始时代'书签,以加快这一进程,并只有整理一个固定金额的存储在一段时间。原指针块本身将是有效的,直至下一次整理,可以通过自由地直到这样一个时改善性能。

具体应用于这是控制台游戏节目和因此,在开始或结束的每一框架的一个整理通过可以做比较安全。

所以我的问题是有人用这种分配方案结合STL将它只是完全的打击STL除了作为我怀疑。我可以看到std::< intrusive_ptr>的工作在intrusive_ptr的水平,但什么样的有关分配的stl列节点自己是无论如何复盖下一个/上的指针是intrusive_ptr的自己或者我只是要有一个标准的堆分配沿边这更多的动态之一。

有帮助吗?

解决方案

如果你要在内存中移动的物体,那么你不能做到这一点完全一般。你将只能与对象要做到这一点知道的,他们可能会被感动。您还需要锁定机制。当一个函数被调用的对象上,那么它不能被移动。

的原因是,在整个C ++模型依赖于在存储器坐在固定点对象,因此,如果一个线程的对象上调用的方法,该线程被暂停和对象移动时,当线程恢复灾难会撞击。

其中保持原始内存指针到另一个对象可能被移动(包括其自身的子对象)任何对象是行不通的。

这样的内存管理方案可以工作,但你必须要非常小心。你需要严格的有关实现把手和把手型>指针锁定语义。

有关STL容器,你可以自定义分配器,但它仍然需要返回固定原始内存指针。你不能返回,可能移动的地址。出于这个原因,如果你使用STL容器,所以一定要把手的容器,和节点本身将是普通的动态分配的内存。你会发现你的开销太多,可在手柄间接仍然有手柄收藏的碎片化问题比你使用STL获得。

使用了解您的把手的容器直接可能是唯一的出路,而且当时还有可能有很多的开销相比,使用固定的内存传统物件,C ++应用程序。

其他提示

STL容器使用裸指针实现。

您可以指定一个自定义的分配器,当你实例化它们(这样它们初始化它们使用分配他们的三分球),但(因为分配的值存储在裸指针)你不知道这些指针,因此,你后不能改变它们。

相反,你可能会考虑实施STL自己的一个子集:您对STL容器的版本,然后才能与管理的指针来实现的。

这是相当熟知的另一种技术是伙伴系统。你应该看一看,对于额外的灵感。

如果这是一个控制台游戏编程这是一个更容易在运行时禁止未范围的动态内存分配。而在启动时间,但是这是一个有点难以实现。

我采取这一点,是,如果必要害怕分裂,那意味着你是杂耍弄数据片这是一个巨大的小部分的你的存储器,并且通过这种美德,你不能有很多。你已经知道这些会是什么?也许会更好,下一个级别,让更多的具体决定,从而妨碍低于其他代码和一般性能的应用程序?

列表是一个非常不好的例子放入一个整理存储管理,因为这是一群小碎片,因为多数其他STL数据结构。如果你这样做,它将具有各种明显的不良影响,包括性能的碎片整理下去,也间接成本等。唯一的结构是有意义的海事组织正contigious的阵列,双端,主要的块hashtable,这些事情,只有超越一定尺寸的,并且只有在他们不要去调整大小的任何更长的时间。这种事情的话,再一次,对特定的解决方案,而不是一般的。

评论回到如何这一切证明。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top