使用gcc编译更大的(~6MB)地图初始化C++文件

DUm*_*man 5 c++ gcc g++ clang

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

g++: internal compiler error: Killed (program cc1plus)
Run Code Online (Sandbox Code Playgroud)

Observing with top表示在此之前该进程达到大约2.2 gig的内存.我试过设置--param gcc-min-expand=0也玩了--param gcc-min-heapsize但是没有解决问题.禁用优化-O0也没有帮助.

我也尝试用clang编译,但结果是相似的.它在超过2演出的记忆之后也被分割.我没有尝试任何额外的选项,因为我不太熟悉它.

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

typedef std::map<std::string, int> StringToIntMap;
StringToIntMap someData = {{"SOMESTRING", 1}, ..};
Run Code Online (Sandbox Code Playgroud)

我想要的是最好用gcc编译文件,虽然如果clang可以工作,我也可以忍受它.从知道内部人员的人那里了解幕后发生的事情也是有帮助的.如果我有一个300 000个元素的映射,其中字符串大约5个字节长,并且int每个元素对应一个,那就是几兆字节的数据,我无法想象初始化器如何将它吹到需要千兆字节到编译.

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

seh*_*ehe 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]。
  • 类的直接和间接虚拟基[1024]。
  • 类的静态成员 [1 024]。
  • 类中的友元声明 [4 096]。
  • 类中的访问控制声明[4 096]。
  • 构造函数定义中的成员初始值设定项 [6 144]。
  • 一个标识符的范围限定[256]。
  • 嵌套外部规范 [1 024]。
  • 递归 constexpr 函数调用 [512]。
  • 模板声明中的模板参数 [1 024]。
  • 递归嵌套模板实例化,包括模板参数推导期间的替换 (14.8.2) [1 024]。
  • 每个 try 块的处理程序 [256]。
  • 在单个函数声明上抛出规范[256]。
  • 占位符数量 (20.8.9.1.4) [10]

现在,初始化列表实际上只是从许多参数“构造”的,显然 GCC 不太支持您提供的数量/体积。

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

  • -mlarge-data(这是默认值)
  • -mlarge-text(也是默认的)