在创建尺寸为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);}
}
最佳答案
如果知道页面大小,则可以分配足够大的内存部分,以保证新分配的内存的某些部分在页面边界上对齐。您将需要分配至少8192字节的内存,以确保在4096字节边界上对齐4096字节。
例如,如果调用malloc
并返回与0xDEAD1001
对齐的偏移量(4097),则需要转到内存地址0xDEAD2000
的下一页,以实现4096字节对齐。然后,您至少需要4096个字节的连续空间。因此,需要分配8192字节。
要获得4k字节对齐的内存位置,可以将4095添加到malloc
返回的地址并屏蔽最后3个字节。
void *mem = malloc(8192);
void *ptr = ((void *)mem+0x0FFF) & ~ (void *)0x0FFF;
编辑:确保保留指向分配的原始内存的指针,以便以后可以转过来使用它来调用
free()
。假设这次,malloc返回了
0xDEAD000F
。0xDEAD000F + 0x0000FFF = 0xDEAD100E
0xDEAD100E & ~0x0000FFF = 0xDEAD1000
如果您不想执行所有这些凌乱的指针算法,我想您可以只使用
posix_memalign
。 checkout here。如果您使用的是其他平台,则可以确定可以使用类似的内存对齐服务。