アプリ版:「スタンプのみでお礼する」機能のリリースについて

win32APIのHeapAlloc()の使い方について、質問です。
割り当てるサイズを指定するときに数バイト(intバイト程度)をちみちみと大量に割り当てるのはよろしくないのでしょうか?
もっとガッツリブロックを確保した方がいいのでしょうか?
動的にどんどんメモリーが必要になる場合、毎回HeapAlloc()で確保すれば、管理が楽かなと思ったのですがそれはナンセンスなのかどうか教えてください。
仮に大きいブロックを確保して、そこへどんどん値を保存していくと、そのうちブロックのサイズを超えて問題が起きると思うのですが、今何バイト使ってるとかいちいち確認して足りなくなったらまHeapAlloc()で確保すればいいのかな?それもそれでなんかなーって思うのですが。
詳しい人おせーてください。

A 回答 (3件)

>動的にどんどんメモリーが必要になる場合、毎回HeapAlloc()で確保すれば、管理が楽かなと思ったのですがそれはナンセンスなのかどうか教えてください。




別にナンセンスじゃないですよ。必要になる度に確保していけばOKです。

ただ、終了時に1つずつ解放するのを忘れないように。
    • good
    • 0
この回答へのお礼

安心しました、特に気にせずやることにします。

お礼日時:2010/02/06 12:35

少しずつ大量にHeapAlloc するのは、


ナンセンスではないですが、ムダが多いです。

OS側では、確保したメモリの他に、どれだけ割り当てたのかなどの管理領域が必要になりますから、
数バイト単位でHeapAlloc すると、その数倍のメモリを消費することになります。

C言語の malloc 関数、C++の new 演算子などでは、
「OSから大量にまとめてメモリを確保したあと、プログラム側に小出しにする」
ようになっていますので、少しずつメモリを確保しても、HeapAlloc ほど効率は悪くなりません。

どうしても HeapAlloc を使わなければならない理由があるのでしたらしかたないですが、
そうでないなら、 malloc や new を使うべきです。

また、C++なら、STL の std::vector などのテンプレートライブラリを使えば、
メモリ確保管理を自動でやってくれますので、
ユーザープログラム側ではメモリ管理を気にする必要が無くなります。
C++なら、そういったテンプレートライブラリを積極的に使った方が格段にコーディングが楽になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
malloc や newを使う方が一般的なんですね。
C++のテンプレートライブラリに触れたことが無いので今後勉強します。

お礼日時:2010/02/06 12:37

 こんにちは。



 1個のヒープハンドルを使用して、HeapAlloc()を呼び出せば、小さなメモリを大量に割り当てられる筈です。
 ナンセンスかどうかと言う問題では無いような気もします。
 と言うのも、ちまちま割り当てるにしろ、大量にプールするにしろ、malloc()やoperator new()で良く行われている事です。
 当方の記憶では、MSVCにおいてmalloc()とoperator new()は、同一の割当て用内部関数へ転送します。
 割当て用内部関数で行っている事はクリティカルセクションを使用し、スレッドセーフにした上で、「HeapAlloc()を呼び出し」て要求サイズを4の倍数へ拡大したサイズと、前後ガード用領域を一張羅に割り当てて、双方向リンクリストに入れて行く事です。
 前後ガード用領域の内容は0xcdcdcdcdに初期化されます。この領域の内容が変わっていたりすると、かの「メモリブロックが壊れた事を示すランタイムエラー」のダイアログが表示されるようになっています。
 ただしこれは、デバックビルドの場合ですので、リリースビルドの場合では、ガード用領域はありません(マクロで除去されるのか、別の割当て用内部関数を使用するのかまではチョッと分からんです)。
 要は、どの様な割り当て方をするにしろ、普段malloc()やoperator new()で行っている事を、HeapAlloc()で行う事は一番飾りの無い状態であるという事です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
malloc()とoperator new()なら安全なんですね。
参考になりました!

お礼日時:2010/02/06 12:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!