是否保证堆分配的块地址不会改变(隐式)?

Posted

技术标签:

【中文标题】是否保证堆分配的块地址不会改变(隐式)?【英文标题】:Is there guarantee heap allocated block address will not change(implicitly)? 【发布时间】:2013-08-11 13:16:17 【问题描述】:

标题不是很清楚,会延伸很多,但我在特定的上下文中询问 - 没有执行用户显式内存重新分配。块只分配一次,不附加任何东西,问题是,它的地址会保持不变吗?

我问的原因是我正在考虑对 VM 进行小优化,当首次分配全局数据时,对函数的初始调用存储为与基指针的偏移量,但第一次执行时,值为缓存,指令改为直接调用,每次都省去额外的计算。因此,这些数据需要持久化才能使优化发挥作用。

【问题讨论】:

【参考方案1】:

是的,否则指针将毫无用处,并且您需要锁定/解锁机制才能使用它们(例如在 C# 中,有 fixed 关键字使对象无法移动)

【讨论】:

【参考方案2】:

地址不会改变。一旦你从内存池中请求了一块内存,你就可以使用它了——操作系统不会再次触及它,直到你free它。

如果你看realloc,这是一个有趣的功能。如果地址可用,它可以将一块内存“附加”到您现有的内存块 - 否则它将找到一个大小为s 的全新内存块。 reallocing 之后的内存块并不总是保证相同。

备注:如果您malloc 一个大小为sfree 的内存块,如果您malloc 另一个块,则不能保证获得相同的内存块大小相同s

【讨论】:

我不希望它,除非使用自定义分配器和安放。 @user2341104,它不会改变。请记住,realloc 可能会更改您的内存块而不是附加到它。但除此之外,答案就在这里——它永远不会改变。

以上是关于是否保证堆分配的块地址不会改变(隐式)?的主要内容,如果未能解决你的问题,请参考以下文章

mmap 是不是连续分配堆内存?

是否有任何理由不会将堆指针分配给数组?

gdb:给定一个地址,我可以找到包含它的已分配块吗?

好友分配算法 - 堆扩展

动态内存分配

java String分配内存空间备忘