我想得到[x] [4096]的表格(例如int table [4096] [4096]) 但我不知道该怎么做 - 特别是以更加一致的方式(它是 在许多编译器上还有较旧的编译器(mingw,dmc,lcc,b55)
我希望得到表格,每行填充一个(或多个)系统
页面(为了效率,它会更快吗?据我知道它可以)
所以我想得到一个填充一组系统页面的ann数组
与他们非常一致
(我希望没有错误的颜色,页面中没有空格)
1)我是否可以通过这种方式获得静态数组(在许多编译器中) 2)如何以malloc方式完成它? (我清楚地记得那个malloc 可以在ram分配之前放置一些元数据,这样会破坏图像, 也许它也没有分配精确的字节数(?),但我不确定 那个
我可以获得这样清晰的分配 - 例如256个对齐的4K页面作为表吗?
答案 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字节边界。