为什么C标准不公开要获取malloc块大小的函数?

nic*_*ola 1 c

假设您通过malloc以下方式在堆上分配了一些内存:

someType x  = malloc(someSize);
Run Code Online (Sandbox Code Playgroud)

当您不再需要时x,您free可以:

free(x)
Run Code Online (Sandbox Code Playgroud)

我想要执行此操作,编译器必须知道x指向的内存大小。我认为free执行类似:

  1. 读取中包含的值x(假设为16)。
  2. 确定以某种方式分配给16的内存大小(假设是8)。
  3. 告诉OS,不再需要16-23内存区域,并且OS可以用它做任何想做的事情。

如果以上内容是正确的,为什么标准中没有规定仅执行上述步骤直到第2步并将大小返回给程序员的函数,而实际上并未释放内存?

我在网上阅读的一些(不太令人信服的)原因:

  • malloc()实现通常跟踪一个区域的大小,但是它们可以间接执行此操作,或将其舍入到某个值,或者根本不保留它。是真的吗 可能malloc无法跟踪大小?
  • 因为C是一种低级编程语言,所以它希望您自己解决这些问题,但这在实现它的确切方式上增加了更大的灵活性。好的,这更具有哲学意义。尽管如此,C标准已经发展并随着时间的推移提供了更多的头文件,函数和工具。
  • 您应该重写每个编译器以实现该功能。真的吗?如果free已经实施,则只需要其中一部分;实施应该是微不足道的。

那么,为什么没有提供此功能的理由是坚定的,推动的,真实的呢?或者,更有可能的是,为什么上述原因实际上很重要,而我又缺少什么呢?

我认为这个问题已经被问到了(很可能是一个骗子),但是我只能找到类似的主题(顺便说一句,下面的问题是我在上面发现的一些异议的地方):

这里讨论了这样的功能是否存在,但是为什么不存在。

这里讨论(堆栈分配的)数组。

th3*_*3lf 6

因为这完全没有必要。打电话的用户malloc()已经知道他/她要求的尺寸。如果他们想存储它,可以使用一个变量来完成。他们甚至可以将其存储在malloc的内存本身中!

其次,当您调用时malloc(size),您几乎永远不会获得精确size字节的内存块。标准唯一保证的是至少获得size字节。这种差异可能是由于诸如对齐,使用更大的块大小以防止碎片等之类的原因造成的。

现在,让我们假设标准库将提供您所要求的那种功能。它应该为您分配大小还是要求的大小?分配的大小在很大程度上取决于实现,并且实际上是没有意义的,因为仅允许您访问最初要求的字节数。如果超出此范围,则它是不确定的行为。如果您说请求的大小,则实现只需要分配的大小即可处理可用的大小,那么为什么还要浪费内存存储请求的大小呢?


Bat*_*eba 5

由于没有人说服C标准委员会相信它的必要性,所以不存在这种功能。

提供它可能还需要与操作系统进行额外的接口连接-经常委派此类内存任务,因此可能需要进行更改才能实现新功能。由于许多平台都支持C,因此可能会损害C的声誉。

最后,您将用它做什么?我无法推测一个用例。如果你想跟踪分配的大小自己,然后为存根功能mallocrealloc,&C。