标题不是很清楚,会延伸很多,但我在特定的上下文中询问 - 没有执行用户显式内存重新分配。块只分配一次,没有附加或任何东西,问题是,它的地址会保持不变吗?
我问的原因是我正在考虑对 VM 进行小优化,当第一次分配全局数据时,对函数的初始调用存储为基指针的偏移量,但第一次执行时,值被缓存并且指令改为直接调用,每次都省去多余的计算。因此,这些数据需要持久化才能使优化工作。
标题不是很清楚,会延伸很多,但我在特定的上下文中询问 - 没有执行用户显式内存重新分配。块只分配一次,没有附加或任何东西,问题是,它的地址会保持不变吗?
我问的原因是我正在考虑对 VM 进行小优化,当第一次分配全局数据时,对函数的初始调用存储为基指针的偏移量,但第一次执行时,值被缓存并且指令改为直接调用,每次都省去多余的计算。因此,这些数据需要持久化才能使优化工作。
是的,否则指针将毫无用处,并且您需要锁定/解锁机制才能使用它们(例如在 C# 中存在fixed
使对象不可移动的关键字)
地址不会改变。一旦您从内存池中请求了一块内存,您就可以使用它了——操作系统不会再触摸它,直到您使用free
它。
如果你看realloc
,这是一个有趣的功能。如果地址可用,它可以将一块内存“附加”到您现有的内存块 - 否则它将找到一个全新的内存块 size s
。realloc
ing之后的内存块并不总是保证相同。
备注:如果你malloc
有一个大小的内存块s
,free
如果你使用malloc
另一个相同大小的块,则不能保证获得相同的内存块s
。