抱歉,如果这是个愚蠢的问题,但它已经困扰了我很长一段时间。
我想知道一些关于内存管理器如何知道内存正在使用的细节。
想象一下,一台拥有1024 B内存的单片微型计算机--没什么可省的。
现在您分配100 ints -每个int是4字节,每个指针4字节也是(例如,8位单芯片很可能有更小的指针,但是w/e)。
所以你刚刚用了800 B的ram来处理100个ints?但更糟糕的是--分配系统必须以某种方式注意内存是malloc的,内存是空的--,200多字节,或其他什么的?或者是一些小伤痕?
发布于 2014-05-08 08:34:53
年轻的开发人员可能会惊讶地发现,像我这样年迈的老开发人员过去常常在内存为1或2k的系统上用C编写。
在这种大小的系统中,动态内存分配将是我们负担不起的奢侈品。这不仅是管理空闲存储的指针开销,也是空闲存储碎片的影响,使得内存分配效率低下,很可能导致严重的内存不足状况(虚拟内存不是选项之一)。
因此,我们过去使用静态内存分配(即全局变量),对所有嵌套函数的深度保持非常严格的控制,并对嵌套中断处理进行更严格的控制。
在这些系统上写作时,我甚至没有链接标准库。我编写了自己的C启动例程,并提供了自定义的最小I/O例程。
我在一个2k内存系统中编写的一个程序使用ram的下部作为数据区,上部部分作为堆栈。在最后一个切分中,我证明了堆栈的最大使用在内存中达到了如此之远,以至于它离数据区域中的最后一个变量有1字节之遥。
啊,过去的美好时光..。
编辑:
要具体回答您的问题,最初的K&R免费存储管理器用来在通过malloc分配的每个内存块的开头添加一个头块。
头块看起来如下所示:
union header {
struct {
union header *ptr;
unsigned size;
} s;
};其中ptr是下一个标头块的地址,而大小是分配给内存的大小(以块为单位)。malloc函数实际上将返回由&header + sizeof(header)计算的地址。空闲函数将从您提供的指针中减去标头的大小,以便将块重新链接回空闲列表。
发布于 2014-05-08 08:37:17
如果这是真的,为什么C总是被偏爱而不是汇编程序呢?
你把问题简化得太多了。C或汇编程序-不重要,您仍然需要管理内存块。主要问题是fragmentation,,而不是实际的管理开销。在您所描述的系统中,您可能只需要分配内存,并且永远不会释放它,因此不需要检查什么是空闲的--水印下面的任何内容都是免费的,就这样。
它真的是这样运作的吗?太低效了?
围绕这个问题有很多算法,但是如果你在简化-是的,基本上是。在现实中,这是一个更复杂的问题-而且还有更复杂的系统围绕着服务内存、处理碎片、垃圾收集(在OS级别)等等。
https://stackoverflow.com/questions/23536372
复制相似问题