我正在分析在创建维度PageSize x PageSize的二维数组时跨虚拟页面的分配效果。我的机器的页面大小是4096.我有一个4096个整数指针(列)的数组,指向4096个整数(行)。
我想在新的虚拟页面上开始分配第一个整数指针。如何识别当前内存位置是否为新页面? 有一次,我已经确定了,我相信我可以写一些垃圾值并将指针移动到一个新的虚拟页面。 这是我分配数组的方式。
array = malloc(ncolumns * sizeof(int *));
for(j = 0; j < ncolumns; j++)
{
array[j] = malloc(nrows * sizeof(int));
if(array[j] == NULL)
{ reportError(8);}
}
答案 0 :(得分:4)
如果您知道页面大小,则可以分配足够大小的内存部分,以保证新分配的内存的某些部分在页面边界上对齐。您将需要分配至少8192字节的内存,以保证在4096字节边界上对齐4096字节。
例如,如果您调用malloc
并返回一个与0xDEAD1001
(4097)对齐的偏移量,则需要转到内存地址0xDEAD2000
的下一页达到4096字节对齐。然后,您将需要至少4096个字节的连续空间。因此,需要分配8192个字节。
要获得4k字节对齐的内存位置,可以将{40}添加到malloc
返回的地址,并屏蔽最后3个字节。
void *mem = malloc(8192);
void *ptr = ((void *)mem+0x0FFF) & ~ (void *)0x0FFF;
编辑确保保留指向所分配的原始内存的指针,以便稍后转身并使用它来调用free()
。
假设这次,malloc返回0xDEAD000F
。
0xDEAD000F + 0x0000FFF = 0xDEAD100E
0xDEAD100E & ~0x0000FFF = 0xDEAD1000
如果你不想做所有这些凌乱的指针算法,我想你可以使用posix_memalign
。看看here。如果您使用的是其他平台,我相信可以使用类似的内存对齐服务。
答案 1 :(得分:2)
仅使用C语言的功能,您无法在页面边界上对齐您的分配(即从malloc返回的内容)。您的示例代码只是分配指向数组的指针数组。它们的位置可以位于虚拟地址空间中的任何位置。确切的位置取决于编译器/库/ OS /等。
操作系统通常具有允许执行此类操作的功能。在Windows上,您可以使用VirtualAlloc
功能。