当我们使用malloc()
时,我们提供以字节为单位的大小。当我们使用free()
时,我们什么都不提供。这是因为操作系统当然已经知道了,它一定把信息存储在了某个地方。
顺便说一句,我们的软件还必须记住它请求了多少内存块,这样我们就可以(例如)从指针开始安全地迭代并继续。
所以,我的问题是:这不是多余的吗我们不能简单地问操作系统给定指针所指向的内存大小吗?因为它知道吗?如果没有,为什么不呢?
当我们使用malloc()时,我们提供了一个以字节为单位的大小。当我们使用free()时不提供任何内容。这是因为操作系统当然知道它一定已经把信息存储在某个地方了。
尽管它为您提供内存,并跟踪属于您的进程的内存范围,但操作系统并不关心内存的内部细节。malloc
将分配的块的大小存储在自己的位置,也保留在进程内部(通常,它在malloc
返回的逻辑地址之前的几个字节)。free
只是读取保留的信息并自动解除分配。
顺便说一句,我们的软件也必须记住它有多少内存块已经请求,这样我们就可以(例如)安全地迭代启动从指针开始前进。
所以,我的问题是:这不是多余的吗?难道我们不能简单地询问操作系统吗给定指针所指向的内存大小,因为它知道吗?如果没有,为什么不呢?
鉴于以上情况,存储该信息是多余的,是的。但您几乎必须存储它,因为malloc
记账的方式是一个实现细节。
如果你知道你的特定实现是如何工作的,并且你想为你的软件承担这个风险,你可以自由地去做(不是双关语)。如果你不想把你的逻辑建立在实现细节的基础上(你不想这样做是对的),你就必须把这个多余的记账与malloc
自己的记账同时进行。
不,它不是多余的。malloc()与free()和其他一些函数合作,在相对较大的块中管理无数个微小的、单独寻址的块,这些块通常是通过sbrk()获得的。操作系统只知道大范围,不知道其中的哪个小块正在使用。为了增加差异,sbrk()只允许移动数据段的末尾,而不是将其拆分为多个部分以独立释放。尽管可以专门使用sbrk来分配内存,但您将无法释放任意块以供重用,或将较小的块合并为较大的块,或在不为此编写一堆记账代码的情况下拆分块,这最终与编写malloc基本相同。此外,使用malloc/free/。。。允许您很少调用sbrk,这是一个性能奖励,因为sbrk是一个具有特殊开销的系统调用。
当我们使用free()时,我们什么都不提供。
不完全正确;我们提供了由CCD_ 8返回的指针。
难道我们不能简单地问操作系统给定指针所指向的内存大小吗?
没有。指针只是地址;除了它们的类型之外,它们不携带关于它们所指向的对象大小的信息。malloc/calloc/realloc
和free
如何跟踪对象大小以及分配的块与空闲块的关系取决于单独的实现;他们可能会在分配的内存之前立即保留一些空间来存储大小,他们可能会构建地址和大小的内部映射,或者他们可能会完全做其他事情。
如果您可以查询指针所指向对象的大小,那就太好了;不幸的是,这根本不是语言的特点。