1

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

我想让表格女巫每一行都填充到一个(或多个)系统页面中(为了提高效率,它会更快吗?据我所知)
所以我想获得一个填充一组系统页面的 ann 数组和它与他们非常一致

(我不希望任何错误,页面中没有空格)

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

我可以把这样清晰的分配加起来 - 例如 256 个对齐的 4K 页面作为表格吗?

4

4 回答 4

2

Windows 中的页面分配功能是VirtualAlloc. 两者都通过MEM_COMMIT | MEM_RESERVE以获得实际分配,而不仅仅是保留。

于 2012-11-30T10:41:13.193 回答
1

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

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

使用这些 API 之一,您应该分配将与 4KB 对齐的大内存块。然后,您只需使用普通指针访问它。

于 2012-11-30T08:01:06.200 回答
1

您可以进行您要求的对齐,但它不会是可移植的,因为C/C++对齐定义中没有标准说明。

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

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

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

于 2012-11-30T08:55:09.790 回答
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(4096*4096) 的最后一个 malloc失败(并产生 0x55505010),因为 glib 实现从不同的池或使用不同的方法(例如系统调用kmalloc)分配不同的大小单元。每次运行的第一个分配地址似乎正好偏移了 10(十六进制)字节,因为这是簿记所需的空间,而且显然堆已经被系统对齐到 4096 字节边界。

于 2012-11-30T10:03:26.993 回答