【问题标题】:What is the maximum size of static array that can be declared in GCC?可以在 GCC 中声明的静态数组的最大大小是多少?
【发布时间】:2013-08-24 15:51:26
【问题描述】:

它是如何确定的?这是否取决于编译器/架构/主机系统?

例子:

int array[0x8000000000000000]; 

对于 x86_64 位系统 GCC 输出中的这一行:

Error "size of array 'array' is too large".

【问题讨论】:

  • 总线大小是一个因素。虚拟内存大小可以是另一个。 8 位 CPU 通常不支持虚拟内存。有的 16 位 CPU 有,有的没有。大多数 32 位 CPU 都支持虚拟内存。我会冒昧地声称所有 64 位 CPU 都支持虚拟内存,但有人可能会举出一个反例。
  • @ted:你必须清楚 wherehow 声明数组。全球范围?功能范围? static关键字?
  • @JimBalter:Z80 CPU(以及 6502、6800、6809 和 8080 芯片)是 8 位机器,但支持 16 位地址,因此内存为 64 KiB(65536 字节)。
  • 如果你的机器有 64 字节的 RAM 和sizeof(int) == 2,那么你可以使用的最大数组大小是int a[32];('内存大小/数组一个元素的大小')和那么您将没有任何其他可用的变量。但是 64 字节的内存应该告诉您最大可能大小为 64,但每个数字必须是 1 字节数字(signed charunsigned char)。一般来说,在没有虚拟内存的情况下,如果内存大小为M,数组中某一项的大小为S,则数组最大大小为M/S。
  • “除了你之外没有人在谈论存储持续时间和变量定位” - 你不正确......这里的第一条评论说“具有自动存储持续时间的块范围数组对象”。你也非常粗鲁。再见。

标签: c arrays gcc compiler-construction


【解决方案1】:

我假设静态数组是指固定长度的数组(静态分配,如int array[SIZE],不是动态分配的)。数组大小限制应该取决于声明的数组的范围。

  • 如果您在本地范围内(在某个例程内)声明了数组,则大小限制由堆栈大小决定。
  • 如果 gcc 在 linux 上运行,堆栈大小由某些环境变量决定。使用ulimit -a查看堆栈大小,使用ulimit -s STACK_SIZE修改堆栈大小。
  • 如果 gcc 在 windows(如 MinGW)上运行,堆栈大小可以通过 gcc -Wl,--stack, STACK_SIZE 指定。
  • 如果您已在全局范围内声明了数组,则该数组将存储在 DATA 或 BSS 部分(分别基于数组是初始化还是未初始化)。 DATA 和 BSS 部分的大小由底层操作系统决定。
  • 如果您已在静态范围内声明了数组(如static int array[SIZE]),则该数组再次存储在 DATA 或 BSS 部分(分别基于数组是初始化还是未初始化)。 DATA 和 BSS 部分的大小由底层操作系统决定。

【讨论】:

  • 最好有一些关于 Linux 和 Windows 的 DATA/BSS 部分大小限制的数字(即使它们可以更改)。
  • GCC 的最大对象大小也被限制为PTRDIFF_MAX,因此即使您可以在 32 位进程中映射超过 2GB,但使用它时可能会出现未定义的行为。
猜你喜欢
  • 2013-01-23
  • 2010-11-26
  • 1970-01-01
  • 2013-01-09
  • 2012-11-10
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
相关资源
最近更新 更多