malloc 内部是如何实现的?如何在以下必要条件下实现 malloc
• Malloc 至少分配请求的字节数
• malloc 返回的指针指向分配的空间(即程序可以成功读取或写入的空间;)
• 除非之前已释放指针,否则对 malloc 的其他调用不会分配此空间或其中的任何部分。
• malloc 应该易于处理:malloc 必须尽快终止(它不应该是 NP-hard !;)
• Malloc 还应提供大小调整和释放。
函数遵循以下签名: void * malloc(size_t size);
最佳答案
解决方法: 为了编写 malloc,我们需要知道堆的开始位置和中断位置, 当然,我们需要能够移动休息时间。我们将使用 sbrk() 系统调用来实现这一点。
Sbrk(n) 将中断移动给定的增量 n(以字节为单位。)
sbrk的特例:当increment为null时(即sbrk(0)),返回值为实际的break地址(新的break地址相同),因此sbrk用于检索break的开头break起始位置的堆
但在满足高级目标时,它会根据请求的大小移动断点,用户将在堆上分配内存,而不满足重新分配并允许它释放的条件 1)所以我们需要知道每个部分从哪里开始以及我们何时在下一个部分的每个部分地址的开始处。 2)那部分的大小是多少 3)该部分是否免费
免费使用 int 似乎是个坏主意,但由于结构默认对齐,所以这无关紧要。
我们必须注意的另一个条件是 malloc 必须返回对齐的地址。如上所示,元部分已经对齐,我们只需要确保数据部分也是如此。
关于c - 理解和实现 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32388847/