1

できるだけ多くの記憶を削る必要があります。STL で標準の C++ を使用しています。このプログラムは (まだ) たいしたことはしておらず、[によるとtop] 960Kb も必要です! 実行可能ファイルのサイズはわずか 64KB です。

コードの長さは 3000 行です。明らかに投稿するつもりはありません。問題は私のコードではなく、システム ライブラリにあると思います。

単一の main() 関数 (すべてのコードが含まれていますが、使用していません)は 732Kb の RAM を使用します!
簡単なコード:

int main() {
sleep(1000); //do nothing
return 0;
}
//Uses 732kb of RAM

私のコードにはグローバル変数がありません(私から隠されているライブラリの変数を除く)。

標準ライブラリ libstdc++ (STL)、GNU libc を使用しています。また、単一の BSD ソケットと libev、および非標準の STL ロープ クラス。

実行できるメモリ プロファイラーはありますか?

プラットフォーム: Linux 2.6.18-32、32 ビット プロセッサ、合計 16MB のシステム RAM、利用可能なスワップなし
コンパイラ: GCC 4
標準ライブラリ: GCC の libstdc++
コンパイラ オプション: -Os (デバッグ シンボルなし)

テンプレートを多用しているわけではありません。コンテナとイテレータだけです。しかし、私は SGI STL ロープ クラスを多用しています。

テスト環境は、128MB RAM、Pentium III 667 Mhz、CentOS 5.5、エミュレーションなしの Linux を実行する基本サーバーです。

更新: ライブラリ自体 (コード サイズ) が問題を引き起こしているかどうか疑問に思っています。共有ライブラリを RAM にロードする必要はありませんか?

4

4 に答える 4

2

メモリ使用量が減るまで、機能の削除を開始します。最初に極端に行ってください。置換できmainsleep(1000);メモリ使用量がまだ多い場合は、コードと静的データに注目してください。グローバルスコープで初期化されたもの、またはクラスまたは関数内で静的なもの、およびさまざまな型のテンプレートのインスタンス化とデバッグシンボル。

UPDATE : STL アロケータに関する誤ったコメントを削除しました。他のコンパイラ/STLバージョンに適用される場合があります(見たい場合は履歴を確認してください)が、この質問には適用されません。

malloc/は、空きメモリを OS に戻すことについてしばしばケチになることに注意してoperator newください。これにより、プログラム全体が時間の経過とともに見かけ上の使用量を縮小することはありません。そのメモリは、将来の割り当てによってプログラム全体で再利用されるため、「メモリ使用量」の数値を最高水準点またはその近くに無期限に維持することを除けば、通常は大きな問題ではありません。

于 2011-04-06T17:54:40.477 に答える
1

リンカーにリンク マップ ファイルを出力させます。これを使用して、静的にリンクされたコードとコードに必要な静的データ領域の量を正確に判断できます。

スタック、ヒープ スペース、および共有ライブラリはこれに追加され、実行時に割り当てられます。

16Mb の RAM がある場合、それは本当に重要ですか? 比較的大きな固定のオーバーヘッドがあり、全体的なメモリ フットプリントが追加されたコード行に比例して増加しない可能性があります。

于 2011-04-08T18:35:50.343 に答える
0

ターゲットは Linux であるため、/proc/{pid_number} にあるマップおよび smaps ファイルを調べることで、メモリ使用量、特に共有ライブラリ コンポーネントの詳細について何かを知ることができると思います。

于 2011-04-11T16:54:14.067 に答える