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

时间:2017-03-02 11:13:13

标签: c++ c++17

我想使用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;

1 个答案:

答案 0 :(得分:1)

  

我在这里看过SO,静态字符数组只能支持[0..65535]的索引范围

C ++标准对数组的维度(静态或动态)没有这样的限制。您将在标准的[implimits]部分找到最低建议实施限制。您所指的限制可能是

  

字符串文字中的字符(连接后)[65 536]

字符串文字确实是一个静态数组,但是这个限制并没有扩展到数组声明。

适用的限制:

  

物体的大小[262 144]。

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

显然存在一些限制因为记忆不是无限的。并且实现可以选择限制甚至比在内存中更合适。例如,在Linux上,如果初始化源中的数据(而不是在运行时读取文件),则数据将存储在.data段中。此段的大小可能受内核选项的限制。您可以使用ulimit -d找到当前限制。

如果您怀疑您的实现不能为大型可执行文件提供足够的空间,那么最好在运行时加载文件内容。