巨大的initializer_list编译分段错误

时间:2018-06-08 10:36:09

标签: c++ qt gcc

    const QHash<QString, float> idfs = {{"the", 0.0023450551861261},
    {"of", 0.00258603321106053},
    {"to", 0.00375511856396871},
    {"and", 0.0040408455383457}

.. 293060多行

编译命令:/usr/local/bin/mpic++ -DQT_CORE_LIB -DQT_NO_DEBUG --isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -isystem /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -Wall -Wextra -std=c++11 -O2 -fPIC -fPIC -o CMakeFiles/antiplagiarism.dir/src/idfs.cc.o -c /home/user/newanalyzer/common/src/idfs.cc

编制结果:g++: internal compiler error: Segmentation fault (program cc1plus)

gcc有很大的初始化列表吗?

gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 

3 个答案:

答案 0 :(得分:0)

  

gcc有很大的初始化列表吗?

是。如果它太大以至于您构建的系统耗尽了资源,那就不行了。 gcc的架构没有固有的限制。

但这是静态数据,QHash是错误的工具。您应该使用gperf之类的东西来代替用户提供的结构。

在你的情况下,gperf的输入文件如下所示:

 %language=C++
 %struct-type
 %define class-name WordHash
 %define slot-name text
 struct Word { const char *text; double frequency; };
 %%
 the, 0.0023450551861261
 of, 0.00258603321106053
 to, 0.00375511856396871
 and, 0.0040408455383457

使用gperf生成的代码,您可以按以下方式查找:

double getFrequency(const char *text) {
  auto *word = WordHash::in_word_set(text, strlen(text));
  Q_ASSERT(!word || strcmp(word->text, text) == 0);
  return word ? word->frequency : -1;
}

答案 1 :(得分:0)

提交gcc的错误https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86118 通过使用排序数组和二进制搜索解决了问题。

答案 2 :(得分:-1)

  

gcc有很大的初始化列表吗?

没有

相反,将数据格式化为JSON对象数组(或作为具有"key" : value对的对象)。您可以使用一些简单的正则表达式命令快速执行此操作(或修改您用于生成init列表的任何内容)。 QT has JSON支持。

如果你必须在程序中有数据(而不是单独的.json文件以便于更新),那么将文件嵌入为const char *定义。