资源的最大静态字符数组?

maximum sized static char array for resources?

我想使用 static unsigned char 数组将包含资源文件(例如图标等)的 .zip 文件编译到我的可执行文件中。我在这里读到,静态字符数组只能支持 [0..65535] 的索引范围,这会将我限制为 64k。但我不确定这是否仍然适用于当前的 C++ 编译器?作为旁注,显然我实际上根本不会在我的程序中使用索引到数组中,而只会使用它的地址。

数组内容示例:

xxd -i example
unsigned char example[] = {
  0x4c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x66, 0x78, 0x2d, 0x38, 0x33, 0x32,
  0x30, 0x20, 0x34, 0x2e, 0x39, 0x2e, 0x31, 0x31, 0x2d, 0x31, 0x2d, 0x41,
  0x52, 0x43, 0x48, 0x20, 0x23, 0x31, 0x20, 0x53, 0x4d, 0x50, 0x20, 0x50,
  0x52, 0x45, 0x45, 0x4d, 0x50, 0x54, 0x20, 0x53, 0x75, 0x6e, 0x20, 0x46,
  0x65, 0x62, 0x20, 0x31, 0x39, 0x20, 0x31, 0x33, 0x3a, 0x34, 0x35, 0x3a,
  0x35, 0x32, 0x20, 0x55, 0x54, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20,
  0x78, 0x38, 0x36, 0x5f, 0x36, 0x34, 0x20, 0x47, 0x4e, 0x55, 0x2f, 0x4c,
  0x69, 0x6e, 0x75, 0x78, 0x0a
};
unsigned int example_len = 89;

I've read here on SO, that a static char array can only support an index range of [0..65535]

C++ 标准没有对数组(静态或动态)的维数施加此类限制。您会在标准的 [implimits] 部分找到最低推荐实施限制。您所指的限制可能是

Characters in a string literal (after concatenation) [65 536]

字符串文字确实是一个静态数组,但此限制不会扩展到数组声明。

确实适用的限制:

Size of an object [262 144].

当然,这些是最低推荐限制。一个实现可能支持更大的对象,我希望程序(尤其是 64 位)支持更大的对象。您可以在编译时使用 SIZE_MAX 宏查询此限制。

显然存在一些限制,因为内存不是无限的。并且一个实现可能会选择比内存更严格的限制。例如在 Linux 上,如果您在源中初始化数据(而不是在运行时读取文件),数据将存储在 .data 段中。该段的大小可以通过内核选项进行限制。您可以使用 ulimit -d.

找到当前限制

如果您怀疑您的实现无法为大型可执行文件提供足够的 space,最好在运行时加载文件内容。