5

我需要一些帮助来思考一项任务。

我的任务是创建一个内存区域

void *memory = malloc(320);

然后使用指针将文本存储到这个存储位置: 我们要把这个区域划分为 32 字节的数据块,所以我们可以存储: 320/32 = 10 个数据块一个 32 字节。在一个数据块中,我可以存储(1 个 ASCSII 字符 = 1 个字节)32 个字符。

我有一个 10 长的位图,其中每个位都指示是否使用数据块(1)或不使用(0)。

但是,如果我想存储 60 个字符长的文本怎么办?然后我需要 2 个数据块(2 x 32 字节)。位图显示数据块 2 和 6 是空闲的,1 和 6 不是并排的。我怎样才能做到这一点?

struct  data {
    char * text;
};

typedef struct data d;

d->text = ???
4

6 回答 6

4

这称为内存碎片,是一个严重的问题。即使在技术上足以支持该块,您也必须报告内存不足。

像 C# 这样不允许指针的托管语言(在正常情况下 - 请不要关注这一点)可以自由地重新排列底层内存并解决这个问题(尽管它在性能方面不是免费的)。

要解决 C 中的问题:
您无能为力,因为这些指向内存的指针会阻止您重新洗牌。其他人提到了伙伴系统,还有其他人,但很少有简单的。很多都是基于预设“大块”和“小块”并且只允许小请求小块等......但这一切都是为了首先停止解决问题,一旦你在那里你要么否认内存请求或扩展池。

于 2010-10-14T21:49:26.170 回答
0

正如其他评论和答案中提到的,这是一个碎片问题。您可以对代码进行碎片整理(这将对系统如何访问内存施加许多要求和限制),或者分配内存。

有一些技术可以最大限度地减少碎片。一种流行的方法是好友内存分配:http ://en.wikipedia.org/wiki/Buddy_memory_allocation

于 2010-10-14T21:52:48.393 回答
0

您必须添加一种内存管理器层来跟踪特定条目占用的插槽(在本例中为字符串)以及插槽的使用顺序 - 您的位字段还不够。

于 2010-10-14T21:53:00.967 回答
0

您的字符串数据结构应该与您的块管理器完全相同,只是它应该跟踪“本地”块而不是内存池中的所有块。

于 2010-10-14T22:00:47.303 回答
0

我脑海中浮现出一些想法:

  • 通过让对存储的所有请求都通过一个对存储进行抽象访问的控制器/管理器(可能与处理位图的相同),添加到您的存储架构中。这将允许您对存储进行碎片整理,而不必担心应用程序的其他部分在碎片整理后指向错误的位置。

  • 您可以重写存储系统的规范,以便使用每个块的一个特定字节来存储标识“下一个”块的数字(因此每个块只有 31 个字节的有效存储空间)。

于 2010-10-14T22:02:23.887 回答
0

您可以从 10 个 32 字节空间中的每一个中提取一个字节,并将该字节用作字符串延续的索引。这实际上是一个链表,您可以通过拥有前向和后向索引使其成为双向链表。

于 2010-10-14T22:02:34.183 回答