c++で配列のサイズが大きく多くて実行時にエラーが起こる場合の対応

配列用のメモリはスタック領域に作成されるが,メモリのサイズは2MBしかないので小さな配列しか確保できない。
もっと大きな配列を確保するには以下の方法を用いる。

  1. static宣言をして配列を定義する。
  2. ヒープ領域のメモリを使うように動的に配列を宣言する。
  3. stack 領域を増やす。

stack領域を増やす方法

使用したプログラム(main.cpp)

stack領域は,windowsの場合は2MB,ubuntuでは8MB(設定によるかもしれない)であった。
double の実数は8バイトだから,26万個の配列でwindowsのスタック領域を超えてしまう。
したがって,これより配列のサイズが大きいときはスタック領域を大きくしないと実行時にエラーが起こる。

(1) ubuntuの場合(Vmware上のubutu13.10 64bit)

(a) 下記,コマンドをシステムコンソール画面から入力する。

$ulimit -s unlimited

プログラムの実行は,コンソール画面から行う。eclipse 上から実行するとエラーで停止する。

(2)ubuntuとwindowsの場合

コンパイラでスタックサイズを指定する。
g++ -Wl,--stack,10485760 a.cpp
a.cppをスタックサイズを10MBとして,コンパイルする。

ubuntuの場合は上記方法で実行できる。

windowsの場合は,Msysから上記コマンドでコンパイルするとスタックサイズが大きくなるが,eclipseからコンパイルしてもスタックサイズは大きくならなかった。

参考文献
http://d.hatena.ne.jp/takehr/20111109/1320836412
http://www.ecs.shimane-u.ac.jp/~stamura/MinGW-gsl.html