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

时间:2013-08-11 13:16:17

标签: c++ c memory-management memory-address consistency

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

我问的原因是我正在考虑对VM进行小优化,当首次分配全局数据时,对函数的初始调用是作为基指针偏移的存储,但是第一次执行它们时,值是缓存并将指令更改为直接调用以保存每次额外的计算。因此,需要持续存储数据才能使优化工作。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

地址不会改变。一旦你从内存池中请求了一块内存,你就可以玩了 - 在你free之前,操作系统不会再次触摸它。

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

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