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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我不希望它,除非使用自定义分配器和安放。
      • @user2341104,它不会改变。请记住,realloc 可能会更改您的内存块而不是附加到它。但除此之外,答案就在这里——它永远不会改变。
      猜你喜欢
      • 1970-01-01
      • 2014-10-25
      • 2012-03-27
      • 1970-01-01
      • 2020-07-06
      • 2018-02-24
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多