プログラムを作る際に、いろいろ気にするのが、メモリの利用方法
メモリは、スタックやら、グローバルやら、ヒープやら、バーチャルやらいろいろあります。
でも、これまで速度をあまり重視していなかったのと、容量的な問題を考慮するのがやだったので、常にGlobalAllocを利用していたのですが・・・
実はこのGlobalAllocはメモリの残量に関係なく、使用回数制限的な面がありました。
これは、先日作っていた、とあるプログラムで、大量のデータを読み書きして、その結果を出力する、ただそれだけのプログラムだったのですが、
あらゆるメモリを動的に確保しようとした結果、それぞれにメモリオブジェクトを大量に作成することになり
このメモリオブジェクトがGlobalAllocを利用していたために、GlobalAllocが半端じゃなく増加し、メモリは全然余裕で余っているにもかかわらずGlobalAlloc自体が失敗するという状況に陥りました。(小さいデータが大量にあったのです)
これはも〜、しばらくなかなか気がつかなかったのですが、
Windowsで利用できるハンドル数に上限があるのですから、どれもそれもいつかは上限に到達するわけです。
そこで、ハンドルを利用しないメモリの確保方法で、
サイズを自由に変更ができ、操作が楽なものを探した結果、ヒープ領域を利用することにしました。
これはGlobalAllocとGlobalLockをがHeapAllocにまと待ったような仕様で、命令が減りはしても、増えることはないという
はじめからこの方が楽だったでしょうか??
ただ、この方法だと最大で確保できるメモリが524,280バイトらしいのです。
これを超えるためには、VirtualAllocを利用するしかないのでしょうか??
あ〜、ヒープサイズを固定した場合ですか・・・
大きいサイズを請求するだけで自動的にVirtualAllocを利用するので問題ないらしいです。
まぁ、そういうわけで、GlobalAllocでハンドルを使い尽くさないようにHeapAllocを利用しましょうね☆
|