2 つの異なるバージョンのメモリ割り当てシステムを持つ画像圧縮アプリケーションがあります。元のものでは、malloc がどこでも使用され、2 番目のものでは、メモリのチャンクを割り当て、そのメモリの一部を myalloc() 呼び出しに返す単純なプール アロケータを実装しました。
malloc を使用すると、膨大なメモリ オーバーヘッドが発生することがわかっています。メモリ使用量が最も多い場合、malloc() コードは 1920x1080x16bpp のイメージに約 170 メガバイトのメモリを必要としますが、プール アロケータは 48 メガバイトしか割り当てず、そのうち 47 メガバイトを割り当てます。プログラムによって使用されます。
メモリ割り当てパターンに関しては、プログラムはテスト イメージで 8 バイト (ほとんど)、32 バイト (多く)、1080 バイト ブロック (いくつか) を割り当てます。これらとは別に、コードには動的なメモリ割り当てはありません。
テスト システムの OS は Windows 7 (64 ビット) です。
メモリ使用量をどのようにテストしましたか?
カスタム アロケーターを使用すると、すべての malloc 呼び出しがアロケーターに委ねられるため、メモリの使用量を確認できます。malloc() を使用して、デバッグ モードでコードをステップ実行し、タスク マネージャーでメモリ使用量を確認しました。リリース モードでも同じことを行いましたが、コンパイラが多くのものを最適化して取り除くため、細粒度は低くなりました。そのため、コードを 1 つずつステップ実行することはできませんでした (リリースとデバッグの間のメモリの違いは約 20 MB であり、これが原因であると考えられます)。最適化とリリース モードでのデバッグ情報の欠如)。
このような巨大なオーバーヘッドの原因は、malloc だけでしょうか? もしそうなら、malloc内でこのオーバーヘッドを正確に引き起こしているのは何ですか?