gpt4 book ai didi

c - 理解和实现 malloc

转载 作者:太空宇宙 更新时间:2023-11-04 01:57:22 24 4
gpt4 key购买 nike

malloc 内部是如何实现的?如何在以下必要条件下实现 malloc

• Malloc 至少分配请求的字节数

• malloc 返回的指针指向分配的空间(即程序可以成功读取或写入的空间;)

• 除非之前已释放指针,否则对 malloc 的其他调用不会分配此空间或其中的任何部分。

• malloc 应该易于处理:malloc 必须尽快终止(它不应该是 NP-hard !;)

• Malloc 还应提供大小调整和释放。

函数遵循以下签名:void * malloc(size_t size);

最佳答案

解决方法:为了编写 malloc,我们需要知道堆的开始位置和中断位置,当然,我们需要能够移动休息时间。我们将使用 sbrk() 系统调用来实现这一点。

enter image description here

Sbrk(n) 将中断移动给定的增量 n(以字节为单位。)

sbrk的特例:当increment为null时(即sbrk(0)),返回值为实际的break地址(新的break地址相同),因此sbrk用于检索break的开头break起始位置的堆

步骤-1 实现(不满足所有标准) enter image description here

但在满足高级目标时,它会根据请求的大小移动断点,用户将在堆上分配内存,而不满足重新分配并允许它释放的条件1)所以我们需要知道每个部分从哪里开始以及我们何时在下一个部分的每个部分地址的开始处。2)那部分的大小是多少3)该部分是否免费 enter image description here

所以基本上我们需要一个包含以下内容的列表 enter image description here

免费使用 int 似乎是个坏主意,但由于结构默认对齐,所以这无关紧要。

我们必须注意的另一个条件是 malloc 必须返回对齐的地址。如上所示,元部分已经对齐,我们只需要确保数据部分也是如此。 enter image description here

寻找 block Base 是指向堆起点的全局指针 enter image description here

Extending Heap – 很简单,我们只是移动断点。 enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

现在我们可以执行我们的 malloc 函数,它只是所有经过的小块的包装 enter image description here

关于c - 理解和实现 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32388847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com