该malloc函数没有页面大小的概念。除非您还要分配与页面边界对齐的页面,否则malloc以这种方式调用不会有任何好处。只是malloc因为你需要很多的元素,并停止担心微观优化的东西,几乎可以肯定不会给你所有的任何好处。
是的,Linux内核一直在做这样的事情。有两个原因:
如果您确实要分配页面大小的内存,则将from的结果sysconf(_SC_PAGESIZE)用作您的size参数。但是几乎可以肯定,您的分配跨越了两个页面。
您的计算elements=pageSize/sizeof(Node);没有考虑malloc()添加到返回的任何块/内存块的元数据malloc().在许多情况下,malloc()将返回一个可能至少在min(sizeof(double),2 * sizeof(void *))边界上对齐的内存块(32个字节变得非常普遍......).如果malloc()在页面上对齐内存块,添加其块(使用填充),并且您编写整页大小的数据,则最后一个字节不在第一页:因此您最终使用2页.
想要一整页,只为你而不用担心浪费内存,而不使用mmap()/ VirtualAlloc()如评论中所建议的那样?这个给你:
int ret;
void *ptr = NULL;
size_t page_size = sysconf(_SC_PAGESIZE);
ret = posix_memalign(&ptr, page_size, page_size);
if (ret != 0 || ptr == NULL) {
fprintf(stderr, "posix_memalign failed: %s\n", strerror(ret));
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这可能与微观优化有关.您可能仍然没有检查过你Node的缓存行的大小倍数,也没有检查如何改进缓存局部性,也没有找到减少内存碎片的方法.因此,您可能会采用错误的方式:首先使其工作,使用profil,优化算法,profil,在最后一个选项进行微优化.