Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C标准不公开一个函数来获得malloc'ed块的大小?_C - Fatal编程技术网

为什么C标准不公开一个函数来获得malloc'ed块的大小?

为什么C标准不公开一个函数来获得malloc'ed块的大小?,c,C,假设您通过malloc在堆上分配了一些内存: 当您不再需要x时,您可以释放它: 我想,要执行这个操作,编译器必须知道x指向的内存大小。我认为free的性能类似于: 读取x中包含的值,并将其设为16。 以某种方式确定分配给16的内存大小,比如说是8。 告诉操作系统不再需要16-23内存区域,操作系统可以用它做任何事情。 如果上述情况属实,为什么标准不规定一个函数,直到第2步才执行上述操作,并将大小返回给程序员,而不实际释放内存 我在网上读到一些不太令人信服的理由: malloc实现通常跟踪一个区域

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

当您不再需要x时,您可以释放它:

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

读取x中包含的值,并将其设为16。 以某种方式确定分配给16的内存大小,比如说是8。 告诉操作系统不再需要16-23内存区域,操作系统可以用它做任何事情。 如果上述情况属实,为什么标准不规定一个函数,直到第2步才执行上述操作,并将大小返回给程序员,而不实际释放内存

我在网上读到一些不太令人信服的理由:

malloc实现通常跟踪一个区域的大小,但它们可能会间接地这样做,或者将其四舍五入到某个值,或者根本不保留它。是真的吗?malloc可能无法跟踪大小吗? 因为C是一种低级编程语言,所以它希望您自己处理这些问题,但这增加了在具体实现方式上的更大灵活性。好的,这更具哲理。尽管如此,随着时间的推移,C标准已经发展并提供了更多的标题、函数和工具。 您应该重写每个编译器来实现这样的功能。这是真的吗?如果free已经实现,你只需要它的一部分;实现应该是微不足道的。 那么,为什么不提供此功能,有一个令人信服的、有力的、真实的原因?或者,更可能的是,为什么上述原因实际上很重要,而我遗漏了什么

我认为这个问题已经被问过了,很可能是一个骗局,但我只能找到类似的主题,例如,顺便说一句,下面的问题是我在上面报告的一些反对意见的地方:

讨论了该函数是否存在,但不讨论为什么不存在


这是关于堆栈分配阵列的讨论。

这样的函数并不存在,因为没有人能够说服C标准委员会它的必要性

提供它还可能需要与操作系统进行额外的接口,在操作系统中,这样的内存任务经常被委派,因此可能需要进行更改以实现新的功能。这可能会损害C被许多平台支持的声誉


最后,你会用它做什么?我无法想象一个用例。如果您想自己跟踪分配的大小,那么为malloc、realloc和c创建存根函数。

这样的函数不存在,因为没有人能够说服c标准委员会它的必要性

提供它还可能需要与操作系统进行额外的接口,在操作系统中,这样的内存任务经常被委派,因此可能需要进行更改以实现新的功能。这可能会损害C被许多平台支持的声誉


最后,你会用它做什么?我无法想象一个用例。如果您想自己跟踪分配的大小,那么就为malloc、realloc和c创建存根函数。

,因为这是完全不必要的。打电话给malloc的用户已经知道他要求的尺寸。如果他们想存储它,他们可以使用一个变量来实现。他们甚至可以把它存储在malloc的内存中

其次,当您调用mallocsize时,几乎永远不会得到大小正好为字节的内存块。标准保证的唯一一件事是,您至少可以获得大小字节。这种差异可能是由于对齐、使用较大的块大小来防止碎片等原因造成的


现在,让我们假设标准库将提供您所要求的那种函数。它应该给你分配的尺寸还是要求的尺寸?分配的大小严重依赖于实现,实际上毫无意义,因为您只允许访问最初要求的字节数。如果你超出这个范围,那就是未定义的行为。如果说请求的大小,那么实现只需要分配的大小来处理空闲的大小,那么为什么还要浪费内存来存储请求的大小呢?

,因为它完全没有必要。打电话给malloc的用户已经知道他要求的尺寸。如果他们想存储它,他们可以使用一个变量来实现。他们甚至可以把它存储在malloc的内存中

其次,当您调用mallocsize时,几乎永远不会得到大小正好为字节的内存块。标准保证的唯一一件事是,您至少可以获得大小字节。这种差异可能是由于对齐、使用较大的块大小来防止碎片等原因造成的

现在,让我们假设标准库将提供您所要求的那种函数。它应该给你分配的尺寸还是要求的尺寸?分配的大小在很大程度上取决于执行部门
因为您只允许访问最初要求的字节数,所以这种关系实际上毫无意义。如果你超出这个范围,那就是未定义的行为。如果你说请求的大小,那么实现只需要分配的大小来处理空闲,那么为什么它还要浪费内存来存储请求的大小呢?

知道块大小的不是编译器,而是操作系统和分配它的程序员。@WeatherVane当你调用free时,你不会说:释放这个大小;您只需提供指针。因此,编译器必须知道分配了多少内存。我错了吗?不,编译器没有说释放这个大小,而是说释放从这个地址开始的块。分配程序负责释放多少,分配程序可能驻留在操作系统中,而编译器对此一无所知。@nicola编译器什么都不知道。它是实现malloc和free函数的c标准库,完全独立于编译器本身。如果确实存在这种情况,则存储在控制块中的分配大小不一定是传递给malloc的大小。公开它对你没有多大好处。知道块大小的不是编译器,而是操作系统和分配块的程序员。@WeatherVane当你调用free时,你不会说:释放这个大小;您只需提供指针。因此,编译器必须知道分配了多少内存。我错了吗?不,编译器没有说释放这个大小,而是说释放从这个地址开始的块。分配程序负责释放多少,分配程序可能驻留在操作系统中,而编译器对此一无所知。@nicola编译器什么都不知道。它是实现malloc和free函数的c标准库,完全独立于编译器本身。如果确实存在这种情况,则存储在控制块中的分配大小不一定是传递给malloc的大小。把它暴露出来对你没有多大好处。我很喜欢第一句话,它需要一些工作。当然没有必要,但可能很方便。标准提供的许多功能实际上是不必要的。我非常喜欢第一句话,它需要一些工作。当然没有必要,但可能很方便。标准提供的许多功能实际上并不必要。注释不用于扩展讨论;此对话已结束。评论不用于扩展讨论;这段对话已经结束。
someType x  = malloc(someSize);
free(x)