【问题标题】: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;吗?一些你可以映射的平面结构会更快阅读;-)

标签: c++ gcc


【解决方案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;),具体取决于您需要如何使用它。但是将其保留为静态数组将使用最少的内存量,因为不需要分配动态内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多