在头文件中包含大量向量

Posted

技术标签:

【中文标题】在头文件中包含大量向量【英文标题】:Including a massive Vector in header file 【发布时间】:2019-07-22 21:05:22 【问题描述】:

所以我有一个巨大的向量,我使用 std::ifstream 对象从 C++ 中的文件逐行加载。这行得通,但我在想,嘿,为什么不将向量写入如下所示的 .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));",
;

当我使用一个小向量和#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 来加载相同大小的向量,所以我不知道这里有什么不同。谢谢。

【问题讨论】:

从文件加载矢量有问题吗?如果不是,我建议这样做。它给您带来的好处是二进制文件更小,您可以更改向量中的数据而无需重新编译源代码。 @NathanOliver 二进制大小不是我需要的问题,但运行时性能是。我宁愿不必等待 ifstream 一条一条地加载行。 编译器经常在编译巨大的自动生成文件时遇到问题,它们会耗尽内存或永远运行。您可以使用编译选项(删除 -g-O1 可能会有所帮助(或伤害)等)。您还可以检查不同版本的编译器是否能更好地处理它。你可以试试中间尺寸,看看你离有效的东西有多远。 在填充向量之前可以做其他事情吗?即启动程序,启动线程以将数据读入向量,在该线程运行时执行其他操作。 类型一定是std::vector&lt;std::vector&lt;std::string&gt;&gt;吗?一些你可以映射的平面结构会更快阅读;-) 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于在头文件中包含大量向量的主要内容,如果未能解决你的问题,请参考以下文章

c语言中,如何在头文件中调用某个源文件的函数??

51单片机一个工程中包含多个C文件怎么使用

c语言在头文件中如何引用另一个头文件中的函数

#include 标题样式

变量定义

为啥在Linux中strlwr()不能编译通过,已经查看过<string.h>,的确在头文件中没有