是否保证堆分配的块地址不会改变(隐式)?
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
的全新内存块。 realloc
ing 之后的内存块并不总是保证相同。
备注:如果您malloc
一个大小为s
和free
的内存块,如果您malloc
另一个块,则不能保证获得相同的内存块大小相同s
。
【讨论】:
我不希望它,除非使用自定义分配器和安放。 @user2341104,它不会改变。请记住,realloc
可能会更改您的内存块而不是附加到它。但除此之外,答案就在这里——它永远不会改变。以上是关于是否保证堆分配的块地址不会改变(隐式)?的主要内容,如果未能解决你的问题,请参考以下文章