11

次のコード:

#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;
}

モードのGCC4.7で内部コンパイラエラーを生成し-std=gnu++11ます。

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

何が問題になっていますか?

4

2 に答える 2

10

プログラムが不当な量のメモリを必要としているようです(おそらくテンプレートの拡張が多すぎるためです)。

最近の使用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

(これは、i3770KIntelプロセッサと16GbRAMを搭載したDebian/ Sid / AMD64で)

私は得ています:

  % 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 ++テンプレートのマクロ展開はチューリング完全であることが知られており、壁にぶつかっただけです。また、GCCトランクは、致命的ですが理解できるエラーを報告します。

話の教訓は、おそらくzshビルトインまたはbashビルトインを使用して、適切に(システムとハードウェアと互換性のある制限を使用して)setrlimit(2)することかもしれません。limitulimit

于 2012-10-27T21:13:07.557 に答える
1

内部エラーは、コンパイラのバグに遭遇したことを意味します。

于 2012-10-27T19:30:22.417 に答える