在创建尺寸为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。如果您使用的是其他平台,则可以确定可以使用类似的内存对齐服务。

10-05 18:15
查看更多