我想要一个[x] [4096]的表格(例如int table [4096] [4096])
但我不确定该怎么做-尤其是以更宽泛的方式(它是
在许多编译器上,也有较旧的编译器(mingw,dmc,lcc,b55)
我想让每行填入一个(或多个)系统的女巫
页面(为了提高效率,是否会更快?据我所知)
所以我想得到一个可以填充系统页面集的数组
与他们非常一致
(我不希望有任何过失,页面中没有空白)
1)我可以这种方式获得静态数组(在许多编译器中)
2)如何以malloc方式完成? (我模糊地记得那个malloc
可以在分配的ram之前放置一些元数据,这样会破坏图像,
也许它也没有分配精确的字节数(?),但我不确定
那个
我是否可以分配这样的明确分配-例如将256个对齐的4K页作为表格?
最佳答案
您可以过度分配和微调指针:
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(4096 * 4096)的最后一个malloc 失败了(产生0x55505010),因为glib实现从不同的池或使用不同的方法(例如系统调用kmalloc)分配了不同的大小单位。每次运行的第一个分配地址似乎正好有10个(十六进制)字节有偏差,因为这是簿记所需的空间,并且显然堆已被系统对齐到4096字节边界。
关于c++ - 如何创建4096个对齐表[x] [4096],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13641031/