【问题标题】:About block alignment in heap memory关于堆内存中的块对齐
【发布时间】:2021-03-09 02:40:26
【问题描述】:

我正在学习使 malloc() 函数实现的学校作业。我有一个关于块对齐的问题。

是否有可能释放的块不是 8 字节的倍数?

当我看到系统编程教科书中关于隐式列表实现的代码时,似乎代码只考虑分配块的对齐。 我对上面的问题很好奇。

【问题讨论】:

  • malloc 在 64 位系统上返回 8 的地址倍数,另一方面,free(malloc(n) + something_different_to_0) 是未定义的行为。
  • 哦我明白了

标签: c malloc dynamic-memory-allocation heap-memory


【解决方案1】:

在 GLIBC 的分配器中,块的内部对齐方式是“2 x sizeof(size_t)”。在 32 位系统上,size_t 是 4 个字节。在 64 位系统上,size_t 为 8 个字节。所以,对齐分别是 8 和 16 字节。

注意:如果您需要其他对齐方式,服务提供posix_memalign()

【讨论】:

    【解决方案2】:

    您只能free 一个通过malloccallocrealloc 分配的内存块。

    如果您确保这些函数始终提供与 8 字节的倍数对齐的地址,那么您无需关心 freeing 除了这样的地址之外的任何其他内容。试图释放未对齐地址的人将违反上述规则并导致未定义的行为。

    【讨论】:

      猜你喜欢
      • 2019-07-03
      • 1970-01-01
      • 2011-06-25
      • 2013-08-10
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 2016-05-07
      • 2018-04-03
      相关资源
      最近更新 更多