配列を作成するためにコンパイラが提供するメモリの量には制限があることを知っています。このメモリを増やすようにコンパイラを構成するにはどうすればよいですか。また、可能であればメリットとデメリットを教えてください。Linux と g++ コンパイラを使用しています。
2 に答える
質問が非常に具体的でない場合でも、答えようとします (コンパイラを指定し、スタックを意味する場合)。
ここで、スタックを意味し、Visual Studio で Linux または Windows を使用していると仮定します。
Linux
Linux では、システム コールsetrlimitを使用できます。次に、このスタック オーバーフロー スレッドのように、コード内でプログラムによってスタックを設定します。
ウィンドウズ
Windows と Visual Studio では、コンパイラ オプション/F
またはを使用できます。/STACK
詳細については、この MSDN ドキュメント ページを参照してください。
場合によっては、スタックの代わりにヒープの使用を検討することもできます。このスレッドには優れた比較があります。次に、動的メモリ割り当てを使用し、スタック サイズを気にしません (ただし、配列へのアプローチが少し異なります)。
別の質問がある場合は、コンパイラを指定してください...
スタック サイズについて話している場合は、使用しているシステムによって異なります。Linuxを使用していると言ったので、プログラムからスタックサイズを変更できます。ただし、これは他の OS には移植できないことに注意してください。スタックサイズを変更するには、この関数を使用できます (多かれ少なかれここからコピーされます)
#include <sys/resource.h>
using namespace std;
//Increases the Stacksize to at least minStackSize
bool setStack(rlim_t minStackSize)
{
struct rlimit rl;
int result;
result = getrlimit(RLIMIT_STACK, &rl);
//If we got an answer
if (result == 0)
{
//Check if Stack is smaller than needed
if (rl.rlim_cur < minStackSize)
{
//Increase Stacksize
rl.rlim_cur = minStackSize;
result = setrlimit(RLIMIT_STACK, &rl);
if (result == 0)
return true;
else
return false;
}
else
return true;
}
else
return false;
}
これは最小限の関数であり、TRUE/FALSE を返すだけでなく、独自のエラー メッセージを追加する必要があることに注意してください。
スタック サイズを大きくする利点は、スタック サイズが許容するよりも多くの変数をスタックに置こうとしても、プログラムがクラッシュしないことです。欠点は、実際に使用されているかどうかに関係なく、このスペースが常にプログラムによって占有されていることです。(ただし、OSは少しだますことができます)