我真的只想分配64KB的内存,而不是128KB,然后手动进行对齐 - 太浪费了。 Windows上的VirtualAlloc正好提供了这种行为。据说SquirrelFish中的代码几乎可以在每个平台上执行此操作,但我还没有设法找到它。是否有一种节省空间的方法在POSIX中的64KB边界上分配64KB?没错,在Linux?
答案 0 :(得分:8)
查看posix_memalign(3)
概要
#include <stdlib.h> int posix_memalign(void **memptr, size_t alignment, size_t size);
说明
The posix_memalign() function allocates size bytes of memory such that the allocation's base address is an exact multiple of alignment, and returns the allocation in the value pointed to by memptr.
查看联机帮助页以获取更多详细信息......
答案 1 :(得分:0)
您可以将mmap()与MAP_PRIVATE一起使用。现在相当多的libc分配器在内部使用mmap()来获取要分配的内存块。
答案 2 :(得分:0)
当然posix_memalign是优雅的解决方案,但即使您分配128k,任何未触及的页面仍将保留为写时复制零页面并使用最少的物理资源。您也可以使用带有MAP_PRIVATE的mmap制作一个128k的地图,然后将其映射的任何部分都不对齐。