设计和编码一个非片段化的静态内存池

我以前听说过这个词,我想知道如何设计和代码之一。
我应该如果有使用STL分配器?
怎样才可以在没有操作系统的设备呢?
什么是使用它,使用常规的编译器实现的malloc /新之间的权衡?

--------------解决方案-------------

试图去描述什么本质上是一个内存池 - 我只是打字了我的头顶部,因为我已经实现的一个,如果事情显然是愚蠢的一段时间,它只是一个建议! :)

1.为了减少碎片,你需要创建特定于对象的你分配在这类型的存储池。 本质上,则然后限制每个分配的大小,以你所感兴趣的对象的大小。您可以实现一个模板类,其具有动态分配块列表(该列表是,你可以生长的空间量的原因可用)。 每一个动态分配的内存块将基本上是T的数组

然后,您将有一个“免费”的名单,这是一个单向链表,这里头指向下一个可用块。 分配,然后简单地返回头。 可以覆盖链表在块本身,即每个“块”(其表示T的对齐尺寸),将基本上为T的与该链接的表的一个节点的联合,当分配,它的T,释放时,列表中的一个节点。 !有明显的危险! 此外,也可以分配一个单独的(和保护块,这增加了更多的开销)持有的地址块中的一个数组。

清分是小事,遍历块列表和第一个可用的,释放分配也是微不足道的,额外的检查,你所要做的就是从中找到这种分配,然后更新头指针块。 (注意,你需要为使用新的位置或覆盖运营商新/删除笔 - 有办法解决这个,谷歌是你的朋友)

“静态”我相信,意味着对T类型的所有对象的缺点是,对于每个T你必须有一个独立的内存池一个单独的内存池。 你可能是聪明,并具有用于管理(利用指针数组汇集对象,其中该索引是例如对象的大小)不同大小的池的单个对象。

前一段的整点是概述究竟如何复杂,这是和像RC上面说,可以肯定你需要它,你这样做之前 - 因为它很可能会推出更多的痛苦比可能是必要的!

2.如果STL分配器满足您的需求,使用它,它的设计有些谁知道他们在做什么非常聪明的人 - 但它是为通用的情况下,如果你知道你的对象是分配的,你可以把上面的执行快点。

3.您需要能够以某种方式分配内存(硬件支持或某种HAL的 - 不管) - 否则我不知道你的程序将如何工作的?

4.定期的malloc /新做了很多更多的东西在幕后(谷歌是你的朋友,我的回答是已经一篇文章!)的简单的allocator我上面描述的是不是重入的,当然你可以用它包装互斥体,以提供一点掩护的,即使这样,我敢大胆地说简单的分配器将执行快几个数量级比普通的malloc /自由。

但是,如果你在这个阶段的优化 - 想必你已经用尽优化的算法和数据结构使用的可能性?

我建议你​​应该知道,你需要一个无碎片内存分配器你把太多精力写你自己的了。 由STD库中提供的通常是足够的。

如果你需要的,可以减少碎片的总体思路是抓住大的内存块一次,并从池分配,而不是要求操作系统为您提供的堆内存偶尔,并在堆内的高度变化的地方,并穿插着许多其他大小不等的物体。 由于专业的内存分配器笔者对从池中分配的对象,以及这些拨款发生的大小更多的知识,分配器可以更有效地利用内存比通用分配器如它所提供的STL之一。

你可以看一下内存分配,如囤积居奇这同时降低了内存碎片,也可以通过提供线程特定的堆从而降低竞争提高性能。 这可以帮助您的应用规模更线性,尤其是在多核心平台。

在多线程分配器更多信息可以在这里找到。

分类:C# 时间:2012-11-08 人气:0
本文关键词: C#,STL,碎片,内存池
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.560 (s). 10 q(s)