c++ - 在头文件中包含一个巨大的 Vector

标签 c++ gcc

所以我有一个巨大的 vector ,我使用 std::ifstream 对象从 C++ 中的文件逐行加载。这行得通,但我在想,嘿,为什么我不像下面那样将 vector 写入 .cpp 文件,而只是 #include 它作为标题:

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 的文件中,我刚刚包含了它)。但是,如果我尝试使用大 vector ,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 逐行加载相同大小的 vector ,所以我不知道这里有什么不同。谢谢。

最佳答案

一种可能性是以仅使用静态数据的方式声明数组,无需调用构造函数。然后整个事情将是编译时数据。有点像

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

其中 MAX_SIZE 是一个常量,它保​​存 vector 的任何特定行的最大条目数。

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

关于c++ - 在头文件中包含一个巨大的 Vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57153706/

相关文章:

c++ - std::istream::read 的通用形式?

c++ - <fstream> (Visual C++ 10) 中的错误 C2766,_Ungetc 的多个显式特化

c++ - 创建 win32 API C++ 后访问组件

c++ - g++ std::set 找不到为类定义的运算符<

c++ - 有多少参数可以传递给 main()

c++ - 我如何以编程方式确定我的 C++ 运行时库在哪里?

c - 需要左值作为赋值的左操作数(尝试设置指针)

c++ - 使用 CryptoPP 库加密和解密字节数组/vector

python - 安装 pylinkgrammar 时缺少文件

c++ - 与 Android 设备的 Windows MTP/WPD 通信