【发布时间】:2017-04-11 20:58:13
【问题描述】:
我在一台 32 位的旧机器上。并想深入了解事情的进展情况。这个系统上的堆实现真的很旧,我认为它使用的是旧的 malloc 算法。 现在我的问题是。 这是我的程序。
#include <stdio.h>
#include <stdlib.h>
struct fp {
int (*fpd)();
};
int main()
{
int *ptr;
malloc(sizeof(struct fp));
printf("Size:%d\n",sizeof(struct fp));
return 0;
}
如果我运行程序,输出为 4。 所以堆块大小应该是 4byte header + 4byte size + 4byte(sizeof struct) 所以堆应该是12字节等于0xc
但是如果我查看 gdb 中的堆,它会告诉我一块 0x10 的大小 等于 16 个字节,但其他 4 个字节来自哪里。这让我很困惑!
或者是否存在最小块大小为 0x10?
【问题讨论】:
-
malloc实现细节不受任何标准的约束。打开它的源代码,看看它对你来说真的很重要。 -
malloc()有可能完全获得 16 字节(或更大)块的内存。在这种情况下,很可能存在比您想象的更多的开销,或者只是从操作系统获得的空间比您请求的更多。并不是说任何这样的额外空间都可以安全使用——malloc()可能会使用它来满足未来的一些请求,而无需从操作系统获得任何额外的内存。 -
如何获取我的 malloc 源代码? @Eugene Sh.
-
堆分配完全有可能(并且相当常规)四舍五入到(例如)2 的下一个幂。
-
这些关于 malloc 使用标头或大小的假设在哪里?你在什么系统上,他们为什么不使用 mmu 表,为什么有一组单独的参数等?为什么不是最小尺寸 4096 或 8192?研究它的工作原理是有价值的。所以去做吧......如果你不知道如何/在哪里,那么你还没有准备好去做那件事,研究图书馆是如何工作的以及系统调用是如何工作的。