首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针元信息

指针元信息
EN

Stack Overflow用户
提问于 2015-05-28 20:27:02
回答 4查看 167关注 0票数 2

realloc()的一个有趣的特性是,它不知何故知道您的数据在复制或扩展分配的内存时是多长时间。

我读到,所发生的事情是,在幕后存储了一些有关指针的元信息(其中包含指针分配的内存大小),通常在指针指向的地址之前(当然,取决于实现)。

所以我的问题是,如果存储了这样的数据,为什么不通过API公开,比如C字符串,就不需要寻找\0来知道字符串的结尾了。

还有其他数百种用途。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-28 20:46:28

正如您自己说的,它取决于标准库的内存管理器的实现。

C没有这类功能的标准,可能是因为一般来说C设计得很简单(但也提供了很多功能)。

尽管如此,除了用于调试内存分配的功能之外,这类功能并没有多大用处。

有些编译器是提供这种类型的功能 (特别是内存块大小),但是很明显,它只用于调试。

编写自己的内存管理器,允许您完全控制分配,甚至对其他库组件进行假设,这并不少见。正如您所提到的,您的实现可以将分配的大小存储在某个标题中,而字符串实现可以引用该值,而不是遍历用于\0终止的字节。

票数 3
EN

Stack Overflow用户

发布于 2015-05-28 20:35:15

这一信息并不总是准确的。

在Windows上,大小被舍入为至少8的倍数。

realloc在这方面做得很好,因为它只关心分配的大小,但不会得到所请求的大小。

票数 2
EN

Stack Overflow用户

发布于 2015-05-29 00:09:23

这里值得了解一下分配器是如何工作的。例如,如果您使用一个伙伴分配器,它将按预定的大小分配块。为了简单起见,假设2的幂(现实世界的分配器通常使用更紧的大小)。

在这种简化的情况下,如果您调用malloc并请求19字节的内存供您个人使用,那么分配器实际上将给您一个32字节的内存块。它不关心它给你的东西比你需要的多,因为它仍然满足你的基本要求,给你的东西比你需要的东西大或大。

这些块大小通常存储在某个地方,不知何故,对于一个通用的分配器来说,它可以处理可变大小的请求,从而能够释放块并完成诸如合并空闲块并将它们分开的事情。然而,他们正在识别块大小,而不是您请求的大小。因此,您不能使用这个块大小来查看字符串的结尾位置,例如,因为根据您的说法,您需要的是19个字节,而不是32个字节。

realloc也不关心您所请求的19字节大小。它在位和字节级别工作,因此如果有必要,它会将整个块的内存值复制到一个新的、更大的块中。

因此,这类块大小对于实现数据结构之类的东西通常并不有用。对于这些,您希望以与所请求的内存量成正比的数据大小工作,这是许多分配器甚至不需要存储的东西(考虑到它们的效率需要,它们不需要存储)。因此,通常由您来跟踪这个大小,这与您的软件的逻辑在某种形式上是一致的(像null终结者一样的哨兵就是一种形式)。

至于为什么在标准中无法查询这些大小,这可能是因为需要知道它是一种相当模糊、低层次的需求,因为它与您实际请求使用的内存数量无关。我经常希望它能满足一些非常低级别的调试需求,但是我已经使用了一些特定于平台/编译器的选项,而且我发现它们并不像我想象的那么方便(甚至对于低级别的调试也是如此)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30516469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档