资源的最大静态字符数组?
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,最好在运行时加载文件内容。
我想使用 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,最好在运行时加载文件内容。