我有一个非常大的常量二维数组存储在C ++文件中。
每行的维度大约为1,000,000行,每行2到10个元素,其中uint8_t
为元素。
每行中的元素数量是可变的,我想使用向量作为行,并且可能是完整数组的向量向量,所以我尝试了3种初始化方法
const uint8_t array[1000000][10] = {{...},...,{...}}; /* Case 1 */
const std::vector<uint8_t> array[1000000] = {{...},...,{...}}; /* Case 3 */
const std::vector<std::vector<uint8_t>> array = {{...},...,{...}}; /* Case 2 */
使用g ++的编译在三种情况下有很大的不同。
案例1快速编译,但我担心浪费一些空间以保持对齐?案例2和案例3有何不同?
案例2和案例3需要很长时间才能编译。添加-ftime-report
表明g ++“阶段选择和生成”步骤需要很长时间。
知道在代码中要改变什么和/或使编译更快?
答案 0 :(得分:3)
您可以在单独的程序集文件中编写“整个数据”,并将该文件和c ++源链接到单个二进制文件中。与您的情况相比,这将非常快。
示例asembly文件:
.globl large_data
.section .rodata
.p2align 5
.type large_data, "object"
.size large_data, <insert_size_here>
large_data:
.byte 77,90,144,0,3,0,0,0,4,0,0,0,255,2..... and so on
示例C ++代码:
extern const uint8_t large_data [];
如果将这些源链接在一起,则可以直接访问数据,例如:
uint8_t x = large_data[0];
这样,您只需要编译一次汇编文件。