Visual C++のメモリ確保関数

以前、Windowsのメモリ確保関数について使い分けを書きましたが、今回はもう少しVisual C++寄りに説明します。

mallocやnewが割り当てる最小単位が何バイト程か考えた事がありますか?

考えた事が全くない場合、貴方のアプリケーションは速度において大きく損している可能性があります。


Visual C++ 2005のデフォルトでは8KBでした。

Visual C++ 2005以前では_amblksizのグローバル変数、2005以降は_set_amblksiz, _get_amblksiz関数を利用することで、取得と変更が出来ます。

このサイズを増やした場合、大きなブロックを割り当てる場合のメモリ確保の速度が速くなり、小さなブロックを割り当てる場合の速度が遅くなります。重要なのは、このサイズを変更しただけでパフォーマンスが劇的に変化するようでしたら、貴方のメモリ確保の方法(というかプログラム設計)は間違っている、ということです。

確認のためにも、設定を変更してみることを推奨します。

結果に大きな改善が見られた場合、纏めて確保し、プールする事を覚えましょう。小さなサイズにはスタックを利用し、巨大なファイルに対しては、VirturalAlloc関数等を適用する工夫をしましょう。フリーリストも良いアイデアです。

さらに、マルチスレッドを利用し、メモリを共有しているのならばMPHeapCreateのような強力なラッパー関数を作成する検討をしても良いハズです(ラッパーの詳細はGoogleで検索をお勧めします)。

メモリ確保とファイルI/Oは極力少なめに。
プログラムを高速化する最も単純な方法だと思います。



[KB10758] Managing Memory with calloc() and malloc()

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz