如何创建4096对齐表[x] [4096]

时间:2012-11-30 07:51:30

标签: c++ c winapi optimization memory-alignment

我想得到[x] [4096]的表格(例如int table [4096] [4096]) 但我不知道该怎么做 - 特别是以更加一致的方式(它是 在许多编译器上还有较旧的编译器(mingw,dmc,lcc,b55)

我希望得到表格,每行填充一个(或多个)系统 页面(为了效率,它会更快吗?据我知道它可以)
所以我想得到一个填充一组系统页面的ann数组 与他们非常一致

(我希望没有错误的颜色,页面中没有空格)

1)我是否可以通过这种方式获得静态数组(在许多编译器中) 2)如何以malloc方式完成它? (我清楚地记得那个malloc 可以在ram分配之前放置一些元数据,这样会破坏图像, 也许它也没有分配精确的字节数(?),但我不确定 那个

我可以获得这样清晰的分配 - 例如256个对齐的4K页面作为表吗?

4 个答案:

答案 0 :(得分:2)

Windows中的页面分配功能是VirtualAlloc。通过MEM_COMMIT | MEM_RESERVE来获得实际分配,而不仅仅是预订。

答案 1 :(得分:1)

由于问题被标记为winapi,我假设您使用的是Windows。 在这种情况下,您可能只想使用_aligned_malloc()

在Linux / POSIX系统上,有posix_memalign()

使用其中一个API,您应该分配大内存块,该内存块将与4KB对齐。然后你应该使用普通指针访问它。

答案 2 :(得分:1)

您可以执行您要求的对齐,但由于C/C++中没有用于对齐定义的标准说明,因此无法移植。

对于静态数据,它通常是一些#pragma或编译器内在函数。

例如,在VC ++中有一个__declspec( align( # ) )可用于数据对齐:http://msdn.microsoft.com/en-us/library/83ythb65(v=vs.110).aspx

对于动态数据,它是相同的非便携式解决方案,有关详细信息,请参阅@mvp answer。但是,对于动态数据,您可以基于标准malloc函数实现自己的对齐数据分配器。由于它基于标准库,您的分配器将是可移植的

答案 3 :(得分:0)

您可以过度分配和微调指针:

 int *a = malloc(4096*4096*4+4095);
 int *b = (int*) (((int)a)+4095 & (~4095)));

也可以(但不保证)分配例如64 + 64字节,发现地址相隔80个字节,然后计算下一个分配单元L的长度,使大单元与给定地址对齐。

#include <string.h>
#include <stdio.h>
int main()
{
  int *a = malloc(64);
  int *b = malloc(64);
  long long excess = ((long)b - (long)a)-64;
  int *c = malloc(4096 - (((int)(b) & 4095) + excess*2 + 64));
  int *d = malloc(4096*4);
  printf("%x %x %x %x\n",
     (int)a & 0xffffffff,(int)b & 0xffffffff, 
     (int)c & 0xffffffff,(int)d & 0xffffffff);
}

输出:18e2010 18e2060 18e20b0 18e3000

一个通知:d = malloc的最后一个malloc(4096 * 4096)失败(并生成0x55505010),因为glib实现从不同的池或不同的方法分配不同的大小单位(例如。系统调用 kmalloc )。每次运行的第一个分配地址似乎都被10(十六进制)字节所偏差,因为这是簿记所需的空间,显然堆已经被系统对齐到4096字节边界。