在堆上分配小于 4KB 的空间?
Allocating less than 4KB on Heap?
请注意我在已接受答案下的后续问题。
我刚读到有关如何完成从虚拟内存到物理内存的转换,我得到了一个有趣的问题。
如果物理内存中帧的最小大小是 4KB,那为什么不说我们可以使用堆来分配最小 4KB 的内存?
或者,如果我只想要堆上的 1 个字节,那么它会分配整个 4KB 的帧,其余部分保持未使用状态(即使其他人有 space)
或者它与其他 allocations/process 分开,因为我们有偏移字段?
试试这个代码:
int main()
{
int* a = malloc(sizeof *a);
int* b = malloc(sizeof *b);
printf("%p\n", (void*)a);
printf("%p\n", (void*)b);
return 0;
}
可能的输出:
0x2164010
0x2164030
如您所见,分配的内存在同一个 4KB 页面 (0x2164xxx) 内,它与页面有 16 字节偏移和 16 字节对齐。
即使从物理地址到虚拟地址的映射是在某个页面大小(例如 4KB)上完成的,在一个映射页面中也可能有多个动态分配。
请注意我在已接受答案下的后续问题。
我刚读到有关如何完成从虚拟内存到物理内存的转换,我得到了一个有趣的问题。
如果物理内存中帧的最小大小是 4KB,那为什么不说我们可以使用堆来分配最小 4KB 的内存? 或者,如果我只想要堆上的 1 个字节,那么它会分配整个 4KB 的帧,其余部分保持未使用状态(即使其他人有 space) 或者它与其他 allocations/process 分开,因为我们有偏移字段?
试试这个代码:
int main()
{
int* a = malloc(sizeof *a);
int* b = malloc(sizeof *b);
printf("%p\n", (void*)a);
printf("%p\n", (void*)b);
return 0;
}
可能的输出:
0x2164010
0x2164030
如您所见,分配的内存在同一个 4KB 页面 (0x2164xxx) 内,它与页面有 16 字节偏移和 16 字节对齐。
即使从物理地址到虚拟地址的映射是在某个页面大小(例如 4KB)上完成的,在一个映射页面中也可能有多个动态分配。