在头文件中包含大量Vector

时间:2019-07-22 21:05:22

标签: c++ gcc

所以我有一个庞大的向量,可以使用std :: ifstream对象从C ++文件中逐行加载。这行得通,但是我在想,为什么我不将向量写到如下的.cpp文件中,而只是将其作为标头包含在内:

std::vector<std::vector<std::string>> vectorOfGates2 = { {
"Q_OR04 g359(.A0 (i2), .A1 (i1), .A2 (i0), .A3 (i3), .Z (ptm_replace_0));",
},
{
"Q_OR04 g357(.A0 (i2), .A1 (i1), .A2 (ptm_replace_0), .A3 (i3), .Z (ptm_replace_1));",
"Q_INV g358(.A (i0), .Z (ptm_replace_0));",
},
{
"Q_OR04 g357(.A0 (i2), .A1 (i0), .A2 (ptm_replace_0), .A3 (i3), .Z (ptm_replace_1));",
"Q_INV g358(.A (i1), .Z (ptm_replace_0));",
}};

当我使用一个很小的vector并#include这个文件时,它就可以工作(vectorOfGates位于我刚刚包含的名为vector.cpp的文件中)。但是,如果我尝试使用大向量,则GCC会给我一个细分违规错误(尝试进行构建可能需要三分钟才能导致此错误:

 22%] Building CXX object CMakeFiles/framework_roman_src_rtl.dir/MappingSingleton.cpp.o
/grid/common/pkgs/gcc/v6.3.0p2/bin/g++  -DBUILD_TO_RUN_WITH_XCELIUM -DET6=ET6 -DLINUX2 -D_GLIBCXX_USE_CXX11_ABI=0 -I/grid/cva/p4_02/hisham/gcc/ua/Framework/Roman/src/x86-lx2-64 -I/grid/cva/p4_02/hisham/gcc/ua/Framework/Roman/src -I/grid/cva/p4_02/hisham/gcc/ap/include -I/grid/cva/p4_02/hisham/gcc/ua/Framework/include -I/grid/cva/p4_02/hisham/gcc/ua/include -I/grid/cva/p4_02/hisham/gcc/sys/avs/xlm/19.03/s1/include -I/grid/cva/p4_02/hisham/gcc/sys/include/x86-lx2-64  -std=c++14 -g   -pthread -g -Wall -Werror -std=gnu++14 -o CMakeFiles/framework_roman_src_rtl.dir/MappingSingleton.cpp.o -c /grid/cva/p4_02/hisham/gcc/ua/Framework/Roman/src/MappingSingleton.cpp
g++: internal compiler error: Segmentation fault (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
gmake[2]: *** [CMakeFiles/framework_roman_src_rtl.dir/MappingSingleton.cpp.o] Error 4
gmake[2]: Leaving directory `/grid/cva/p4_02/hisham/gcc/ua/Framework/Roman/src/cmake-build-debug'
gmake[1]: *** [CMakeFiles/framework_roman_src_rtl.dir/all] Error 2
gmake[1]: Leaving directory `/grid/cva/p4_02/hisham/gcc/ua/Framework/Roman/src/cmake-build-debug'
gmake: *** [all] Error 2

我在做什么错?如果我尝试逐行使用ifstream来加载相同大小的向量,那么我不知道这里有什么不同。谢谢。

1 个答案:

答案 0 :(得分:1)

一种可能性是用仅使用静态数据的方式声明数组,而无需调用构造函数。那么整个事情就是编译时间数据。像

const char *vectorOfGates2[][MAX_SIZE] = {
    { "string1" },
    { "string2", "string3" },
    // ...
};

其中MAX_SIZE是一个常数,用于保存向量的任何特定行的最大条目数。

如有必要,可以在程序启动时将其转换为std::vector<std::vector<std::string>>(或std::vector<std::vector<const char *>>),具体取决于您如何使用它。但是,将其保留为静态数组将使用最少的内存,因为不需要分配动态内存。