首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11: g++-4.7内部编译器错误

C++11: g++-4.7内部编译器错误
EN

Stack Overflow用户
提问于 2012-10-28 03:23:04
回答 2查看 13.9K关注 0票数 11

以下代码:

代码语言:javascript
复制
#include <iostream>
#include <array>
using namespace std;

constexpr int N = 1000000;
constexpr int f(int x) { return x*2; }

typedef array<int, N> A;

template<int... i> struct F { static constexpr A f() { return A{{ ::f(i)... }}; } };

template<class A, class B> struct C {};
template<int... i, int... j> struct C<F<i...>, F<j...>> : F<i..., (sizeof...(i)+j)...>
{
        using T = F<i..., (sizeof...(i)+j)...>;
};

template<int n> struct S : C<typename S<n/2>::T, typename S<n-n/2>::T> {};
template<> struct S<1> : F<0> { using T = F<0>; };

constexpr auto X = S<N>::f();

int main()
{
        cout << X[3] << endl;
}

-std=gnu++11模式下的GCC 4.7中产生内部编译器错误。

代码语言:javascript
复制
$ g++ -std=gnu++11 test.cpp
g++-4.7.real: internal compiler error: Killed (program cc1plus)

哪里出了问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-28 05:13:08

您的程序似乎需要不合理的内存量(可能是因为太多的模板扩展)。

使用最新的g++-trunk

代码语言:javascript
复制
gcc version 4.8.0 20121026 (experimental) [trunk revision 192860] (GCC) 

具有以下zsh限制:

代码语言:javascript
复制
   % limit          
   cputime         unlimited
   filesize        unlimited
   datasize        15000MB
   stacksize       8MB
   coredumpsize    400MB
   memoryuse       15000MB
   maxproc         128166
   descriptors     1024
   memorylocked    64kB
   addressspace    16000MB
   maxfilelocks    unlimited
   sigpending      128166
   msgqueue        819200
   nice            0
   rt_priority     0
   rt_time         unlimited

(这是在采用i3770K英特尔处理器和16 on内存的Debian/Sid/AMD64上)

我得到了:

代码语言:javascript
复制
  % time g++-trunk -std=gnu++11 andrew.cc -o andrew
  virtual memory exhausted: Cannot allocate memory
  g++-trunk -std=gnu++11 andrew.cc -o andrew :
  108.25s user 3.28s system 89% cpu 2:03.98 total

因此,模板扩展似乎需要太多的内存,以至于你的程序是不合理的。

我不确定这是否会被接受为一个GCC的bug。众所周知,C++模板的宏扩展是图灵完成的,您只是碰壁了。而GCC后备箱确实报告了一个致命但可以理解的错误。

这个故事的寓意可能是适当地使用setrlimit(2) (具有与您的系统和硬件兼容的限制),也许使用limit zsh内置或ulimit bash内置。

票数 10
EN

Stack Overflow用户

发布于 2012-10-28 03:30:22

一个内部错误意味着你遇到了一个编译器错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13103396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档