用于初始化矢量的大矢量的长编译

时间:2018-03-28 13:25:25

标签: c++ large-data

我有一个非常大的常量二维数组存储在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 ++“阶段选择和生成”步骤需要很长时间。

知道在代码中要改变什么和/或使编译更快?

1 个答案:

答案 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];

这样,您只需要编译一次汇编文件。