4

今日、私のコンピューターサイエンスのクラスで、プログラムがコンパイル中に割り当てることができるメモリの量を調整できると言われました(GCC、Linuxを使用)。この量は、デフォルトで最適モードに設定されています(つまり、可能な限り多くのことを意味します)。

16 GBを超えるRAMを搭載したPCでは非常に難しい割り当てエラーを適切に処理する必要があるため、アプリケーションのデバッグ中にこのコンパイラ機能の恩恵を受けることができます。

誰かがこのオプションが何であるか知っていますか?gcc --maxalloc 1024私のプログラムが最大1024バイトのメモリを割り当てることができることを意味するようなsthを期待しています。

4

3 に答える 3

8

このためのコンパイラオプションはわかりません。ただし、ulimitLinuxコマンドを使用して、プロセスが使用できるメモリの量を制限することができます。

たとえば、次のコマンドは、現在のシェルから実行されるアプリケーションのデータセグメントサイズを制限します。

ulimit -d 1024K
于 2012-10-18T21:30:25.683 に答える
2

最も簡単な方法は、グローバルnew/delete演算子をオーバーロードし、割り当てることができるメモリのサイズを制限することです。

これは完全にC++であり、任意のコンパイラを使用する任意のプラットフォームでも機能します。

于 2012-10-18T22:00:47.323 に答える
1

あなたの質問はあいまいです。コンパイル中にgccまたはコンパイラによって使用されるメモリリソースが気になる場合は、(さまざまなGCCフェーズの時間とメモリの両方を報告する)を使用してそれらを測定できます。トリッキーなGCCプログラム引数を使用してコンパイルするためにコンパイラーが消費するリソースを減らすことができます(詳細についてはGCCドキュメントを参照)。または、 setrlimit(2)システムコールとインターフェイスするシェルの組み込みを使用してメモリ制限を下げることができます。他の人が示唆しているように、同じ組み込みコマンドとsyscallを使用してプログラムを実行するために、使用可能なメモリを制限することもできます。g++gcc -ftime-reportulimitbashulimitsetrlimit

しかし、あなたはおそらくあなたのプログラムによって消費されるメモリリソースを気にかけているでしょう。でコンパイルし、最初にvalgrind(および)を使用してメモリリークをデバッグg++ -Wall -gする方法を学ぶことをお勧めします。とを再定義することもできます。gdbmallocfree

または、 Boehmの保守的なガベージコレクターの使用を検討することもできます。次に、GC_mallocの代わりに使用mallocする(またはのnew(gc)代わりに使用する)と、またはnewについてこれ以上気にする必要はありません。ただし、これは控えめなガベージコレクターです(運が悪ければ、メモリリークが発生する可能性があります)。freedelete

一部のプロセスで使用されるアドレス空間をより深く理解するには、特にプロセス1234のマップ、または独自のプロセスのマップにproc(5)疑似ファイルシステムを使用します。(端末で実行して、そのコマンドのメモリマップを確認します)。コマンドもあります。/proc/1234/maps/proc/self/mapscat /proc/self/mapscatpmap

于 2012-10-19T05:22:39.787 に答える