分配的内存块的簿记是多余的吗?

时间:2014-09-17 12:58:13

标签: c memory-management malloc free

当我们使用malloc()时,我们提供字节大小。 当我们使用free()时,我们什么都不提供。 这是因为操作系统当然已经了解它,它必须在某处存储信息。

顺便说一下,我们的软件也必须记住它请求了多少内存块,这样我们就可以(例如)从指针开始安全地迭代并继续前进。

所以,我的问题是:这不是多余的吗?我们不能简单地向操作系统询问给定指针指向的内存大小,因为它知道它吗?如果没有,为什么不呢?

3 个答案:

答案 0 :(得分:1)

  

当我们使用malloc()时,我们提供一个字节大小。当我们使用free()时   什么都不提供这是因为OS当然知道它   已经,它必须在某处存储信息。

即使它为您提供内存并且它跟踪您的进程所属的内存范围,操作系统也不会关注内存的内部细节。 malloc将已分配块的大小存储在自己的位置,也保留在进程内(通常,它是malloc返回的逻辑地址之前的几个字节)。 free只是读取保留的信息并自动解除分配。

  

顺便说一句,我们的软件也必须记住它有多少内存块   请求,以便我们可以(例如)安全地迭代启动   从指针开始。

     

所以,我的问题是:这不是多余的吗?我们不能简单地询问操作系统   由于知道它,给定指针指向的内存大小?   如果没有,为什么不呢?

鉴于上述情况,存储该信息是多余的,是的。但是你几乎必须存储它,因为malloc保存簿记的方式是一个实现细节。

如果你知道你的特定实现是如何工作的,并且你想要冒这个软件的风险,你就可以免费(没有双关语)。如果您不希望将逻辑基于实现细节(并且您不想这样做),则必须与malloc'并排执行此冗余簿记。自己的簿记。

答案 1 :(得分:1)

不,它不是多余的。 malloc()与free()和一些其他函数合作,在相对较大的块中管理一个极小的,单独寻址的块,这些块通常用sbrk()获得。操作系统只知道大范围,并且不知道其中的哪个小块正在使用中。要添加差异,sbrk()只允许您移动数据段的末尾,而不是将其拆分为多个部分以便独立释放。虽然可以使用sbrk专门分配内存,但是你可能无法释放任意块以供重用,或者将较小的块合并为较大的块,或者在不为此目的编写一堆簿记代码的情况下拆分块 - 这最终基本上与写malloc。另外,使用malloc / free / ...允许你很少调用sbrk,这是一个性能加值,因为sbrk是一个特殊开销的系统调用。

答案 2 :(得分:0)

  

当我们使用free()时,我们什么都不提供。

不完全正确;我们提供malloc返回的指针。

  

我们不能简单地向操作系统询问给定指针所指向的内存大小,因为它知道它吗?

不。指针只是地址;除了他们的类型,他们没有任何关于他们指向的对象的大小的信息。 malloc/calloc/reallocfree如何跟踪对象大小以及分配与空闲块的方式取决于单个实现;他们可以在分配的内存之前立即保留一些空间来存储大小,他们可以构建地址和大小的内部地图,或者他们可以完全做其他事情。

如果您可以查询指针指向它指向的对象的大小,那将是很好的;不幸的是,这根本不是语言的一个特征。