realloc()的一个有趣的特性是,它不知何故知道您的数据在复制或扩展分配的内存时是多长时间。
我读到,所发生的事情是,在幕后存储了一些有关指针的元信息(其中包含指针分配的内存大小),通常在指针指向的地址之前(当然,取决于实现)。
所以我的问题是,如果存储了这样的数据,为什么不通过API公开,比如C字符串,就不需要寻找\0来知道字符串的结尾了。
还有其他数百种用途。
发布于 2015-05-28 20:46:28
发布于 2015-05-28 20:35:15
这一信息并不总是准确的。
在Windows上,大小被舍入为至少8的倍数。
realloc在这方面做得很好,因为它只关心分配的大小,但不会得到所请求的大小。
发布于 2015-05-29 00:09:23
这里值得了解一下分配器是如何工作的。例如,如果您使用一个伙伴分配器,它将按预定的大小分配块。为了简单起见,假设2的幂(现实世界的分配器通常使用更紧的大小)。
在这种简化的情况下,如果您调用malloc并请求19字节的内存供您个人使用,那么分配器实际上将给您一个32字节的内存块。它不关心它给你的东西比你需要的多,因为它仍然满足你的基本要求,给你的东西比你需要的东西大或大。
这些块大小通常存储在某个地方,不知何故,对于一个通用的分配器来说,它可以处理可变大小的请求,从而能够释放块并完成诸如合并空闲块并将它们分开的事情。然而,他们正在识别块大小,而不是您请求的大小。因此,您不能使用这个块大小来查看字符串的结尾位置,例如,因为根据您的说法,您需要的是19个字节,而不是32个字节。
realloc也不关心您所请求的19字节大小。它在位和字节级别工作,因此如果有必要,它会将整个块的内存值复制到一个新的、更大的块中。
因此,这类块大小对于实现数据结构之类的东西通常并不有用。对于这些,您希望以与所请求的内存量成正比的数据大小工作,这是许多分配器甚至不需要存储的东西(考虑到它们的效率需要,它们不需要存储)。因此,通常由您来跟踪这个大小,这与您的软件的逻辑在某种形式上是一致的(像null终结者一样的哨兵就是一种形式)。
至于为什么在标准中无法查询这些大小,这可能是因为需要知道它是一种相当模糊、低层次的需求,因为它与您实际请求使用的内存数量无关。我经常希望它能满足一些非常低级别的调试需求,但是我已经使用了一些特定于平台/编译器的选项,而且我发现它们并不像我想象的那么方便(甚至对于低级别的调试也是如此)。
https://stackoverflow.com/questions/30516469
复制相似问题