5

我正在尝试编译一个 5.7 MB 大的 C++ 文件。我正在 64 位 Linux 系统上构建一个 64 位 Linux 可执行文件。不幸的是,g++ 4.7.2 不合作:

g++: internal compiler error: Killed (program cc1plus)

观察top表明该过程在此之前达到了大约 2.2 gigs 的内存。我尝试设置--param gcc-min-expand=0并玩过,--param gcc-min-heapsize但这并没有解决问题。禁用优化-O0也没有帮助。

我也试过用clang编译,但结果是相似的。它在超过 2 gigs 的内存后也出现了段错误。我没有尝试使用 clang 的任何额外选项,因为我对它不太熟悉。

有问题的源文件包含几个映射的 C++11 样式初始化。

typedef std::map<std::string, int> StringToIntMap;
StringToIntMap someData = {{"SOMESTRING", 1}, ..};

我想要的是最好用 gcc 编译文件,尽管如果 clang 可以代替,我也可以忍受它。从了解内部情况的人那里了解幕后发生的事情也很有帮助。如果我有一个包含 300 000 个元素的映射,其中字符串大约 5 个字节长,并且int每个元素对应一个,那就是几兆字节的数据,我无法轻易想象初始化程序如何将它炸到需要千兆字节的地步编译。

并抢占我不应该有这么大的源文件的评论。我知道我可以在运行时从数据文件中读取数据,这就是程序现在所做的,但我的用例是程序的执行时间是最重要的因素。

4

1 回答 1

4

允许编译器对许多语言结构中支持的级别/数量设置实现定义的限制。

附录 B 列出了符合标准的编译器所需的最小数量

在附录 B 中,将最相关的部分加粗:

这些限制可能会限制包括以下描述的数量或其他数量。建议将每个数量后面的括号中的数字作为该数量的最小值。但是,这些数量仅作为指导,并不能确定合规性。

  • 复合语句、迭代控制结构和选择控制结构的嵌套级别[256]。
  • 条件包含的嵌套级别[256]。
  • 指针、数组和函数声明符(任意组合)修改声明中的类、算术或不完整类型 [256]。
  • 在完整表达式中嵌套括号表达式的级别[256]。
  • 内部标识符或宏名称 [1 024] 中的字符数。
  • 外部标识符 [1 024] 中的字符数。
  • 一个翻译单元中的外部标识符 [65 536]。
  • 在一个块 [1 024] 中声明的具有块范围的标识符。
  • 在一个翻译单元中同时定义宏标识符 [65 536]。
  • 一个函数定义中的参数 [256]。
  • 一个函数调用中的参数 [256]。
  • 一个宏定义中的参数 [256]。
  • 一个宏调用中的参数 [256]。
  • 一个逻辑源代码行中的字符 [65 536]。
  • 字符串文字中的字符(连接后)[65 536]。
  • 对象的大小 [262 144]。
  • #include 文件的嵌套级别 [256]。
  • switch 语句的 case 标签(不包括任何嵌套 switch 语句的标签)[16 384]。
  • 单个类中的数据成员 [16 384]。
  • 单个枚举中的枚举常量 [4 096]。
  • 单个成员规范中嵌套类定义的级别 [256]
  • atexit() [32] 注册的函数。
  • at_quick_exit() [32] 注册的函数。
  • 直接和间接基类 [16 384]。
  • 单个类的直接基类 [1 024]。
  • 在单个类中声明的成员 [4 096]。
  • 类中最终覆盖的虚函数,可访问或不可访问 [16 384]。
  • 类的直接和间接虚基 [1 024]。
  • 类的静态成员 [1 024]。
  • 类中的朋友声明 [4 096]。
  • 类中的访问控制声明 [4 096]。
  • 构造函数定义中的成员初始值设定项 [6 144]。
  • 一个标识符的范围限定[256]。
  • 嵌套的外部规范 [1 024]。
  • 递归 constexpr 函数调用 [512]。
  • 模板声明中的模板参数 [1 024]。
  • 递归嵌套模板实例化,包括模板参数推导期间的替换 (14.8.2) [1 024]。
  • 每个尝试块的处理程序 [256]。
  • 在单个函数声明上抛出规范 [256]。
  • 占位符数量 (20.8.9.1.4) [10]

现在,初始值设定项列表实际上只是由许多参数“构造”而成,显然 GCC 并不完全支持您提供的数量/体积。

手册页中可能有一些选项可以缓解这种情况:

  • -mlarge-data(这是默认设置)
  • -mlarge-text(也是默认值)
于 2013-09-07T19:20:48.740 回答