【问题标题】:Malloc implementation for prologue and epilogue in CC 中序言和尾声的 Malloc 实现
【发布时间】:2021-12-21 02:54:29
【问题描述】:

我有一个任务是写my_free()my_malloc()函数。

但是我们如何创建尾声和序言以正确地错位页眉和页脚?

假设我们使用sbrk() 从堆中请求4096 bytes

我做吗

void* my_malloc(size_t size)
{
    void* heapspace = sbrk();
    heapspace += 8 // ?? Do i do this to create epilogue?


}

【问题讨论】:

  • 这取决于您存储簿记信息的方式。 void* 上的 BTW 指针算法是一个非标准扩展,为了可移植性更喜欢 char*

标签: c malloc


【解决方案1】:
heapspace += 8; 

不会对齐任何东西。如果需要8字节对齐,未对齐地址加8,结果还是一样的未对齐。

你需要:

void *align(void *ptr, unsigned alignment)
{
    uintptr_t addr = (uintptr_t)ptr;

    if(addr % alignment)
    {
        addr = ((addr / alignment) + 1) * alignment;
    }
    return (void *)addr;
}
void* my_malloc(size_t size)
{
    char* heapspace = sbrk();
    heapspace += sizeof(size);   //example header size
    heapspace = align(heapspace, 8);

}

【讨论】:

  • 我不确定 OP 是在尝试与 += 8 对齐,还是为簿记留出空间。
  • @Arkku 同样的功能也可以。添加标题,然后使用函数正确对齐数据。
  • 很公平,当时我评论这个答案只有align 函数,所以它似乎并没有真正回答这个问题。现在使用 my_malloc 会更好,尽管我仍然不确定 OP 到底在问什么。
  • @Arkku 对齐1060 怎么样。这个功能是通用的。对于 8 就足够了 ((addr >> 3) + 1) << 3 需要检查以不重新对齐对齐的地址
  • 是的,确实,不必要的混淆。 =)
猜你喜欢
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多