C ++ 11:g ++ – 4.7内部编译错误

以下代码:

#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<nn/2>::T> {}; template<> struct S<1> : F<0> { using T = F<0>; }; constexpr auto X = S<N>::f(); int main() { cout << X[3] << endl; } 

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

 $ g++ -std=gnu++11 test.cpp g++-4.7.real: internal compiler error: Killed (program cc1plus) 

出了什么问题?

Solutions Collecting From Web of "C ++ 11:g ++ – 4.7内部编译错误"

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

使用最近的g++-trunk

 gcc version 4.8.0 20121026 (experimental) [trunk revision 192860] (GCC) 

具有以下zsh限制:

  % 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 

(这在Debian / Sid / AMD64与i3770K英特尔处理器和16Gb RAM)

我正进入(状态:

  % 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的错误。 C ++ tenplate macroexpansion被称为图灵完成,你只是碰壁。 GCC主干报告了一个致命但可以理解的错误。

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

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