0

假设我有一个大小为 78719476736 字节的数组。请注意,这个数组是在我的 C 代码中使用 malloc 动态分配的。假设 malloc 在分配这么多内存后返回一个有效指针。该数组的大小大于 UINT_MAX(4294967295) ,即无符号整数的最大限制(32 位)

假设我的代码如下所示

int *buf;
buf = (int*)malloc(78719476736);

这里 78719476736 大于 4 * UINT_MAX。

现在,如果我必须引用 buf 的所有元素,那么由于 buf 是 int* 它将是 32 位的,因此它将无法处理我使用 malloc 分配的所有内存元素(78719476736 字节)。

我的问题是不应该将上面的代码更改为使 buf 为 long(64 位变量),因为只有 long long 变量才能解决我分配的大内存。

更改代码例如

unsigned long long int buf;
buf = (unsigned long long int*)malloc(78719476736);

事实上我认为,变量 buf 不应该再是一个指针,因为任何指针都将是 32 位宽,因此它将无法访问 78719476736 字节。

所以它应该是一个普通的 unsigned long long int ,我必须将 malloc 返回指针值转换为一个 unsigned long long int ,如上面更改的代码所示,并使用 buf 访问所有分配的元素。

我的上述假设是否正确?

或者

我是否感到困惑/遗漏了什么?

编辑:如果有帮助,

我正在使用在 Intel Core 2 Duo(64 位 CPU)上安装 WinXP 的台式机。所以从 CPU 角度来说,访问超过 4 GB 的地址空间应该不是问题。应该启用哪些所有其他组件以支持 64 位,即

a.) 如何在编译时启用对 64 位的编译器支持(我使用的是 Visual Studio 2005 专业版)

b.) 操作系统支持 64 位 - 我使用的是 Windows XP Professional。

谢谢你。

-广告。

4

6 回答 6

7
  1. 您需要 64 位操作系统
  2. malloc 接收 size_t 作为 64 位平台上的 64 位参数
  3. 最重要的是:您可能应该想:我是否需要分配超过 4G 的内存?
于 2009-06-16T12:49:58.763 回答
5

我认为您对指针是什么感到非常困惑。至少在通用系统上,指针的大小(不同值的数量,即不同地址的数量)与类型无关!

int *a;
short *b;
double *c;

a、b 和 c 是指向不同类型的指针,但它们都具有相同的大小(例如,在 32 位系统上为 4 个字节)。与 32 位相比,这正是 64 位系统的要点:能够从指针寻址超过 2**32 个位置。

此外,32 位 CPU 在硬件中也无法寻址超过 4 Gb [1],相应的虚拟地址空间也通常限制为 32 位。因此分配 8 Gb 内存无论如何都不太可能工作。

[1] 这并不完全正确——例如,英特尔 CPU 具有扩展功能,因此 32 位 CPU 可以使用“扩展”地址。

于 2009-06-16T13:03:46.927 回答
4

Anint*是指针类型。如果您在一个可以分配 78719476736 字节的系统上,它可能至少有 64 位地址,即sizeof(int*) >= 8. 指针大小与什么无关sizeof(int)

于 2009-06-16T12:51:29.523 回答
1

要处理超过 4GB 的内存,您需要某种机制来选择该内存。因此,您需要将您的应用程序编译为 64 位,然后您的所有指针都将是 64 位宽。

访问超过 4GB 内存的唯一其他方法是使用额外的地址/内存选择器机制,就像您在实模式 DOS 时代使用的段和偏移量一样。这当然取决于您的处理器架构。

于 2009-06-16T12:51:16.560 回答
1

如果您在 64 位操作系统上运行您的软件并使用 64 位编译器设置,那么您的所有指针都是 64 位的。无需特别声明。

于 2009-06-16T12:51:28.837 回答
0

这是不可能的,你的编译器和操作系统不支持,期间。

对于 Windows,您可以查看_HEAP_MAXREQ的文档。

阅读一些选项,

64 位大型 malloc

于 2009-07-14T06:45:16.357 回答