
win32APIのHeapAlloc()の使い方について、質問です。
割り当てるサイズを指定するときに数バイト(intバイト程度)をちみちみと大量に割り当てるのはよろしくないのでしょうか?
もっとガッツリブロックを確保した方がいいのでしょうか?
動的にどんどんメモリーが必要になる場合、毎回HeapAlloc()で確保すれば、管理が楽かなと思ったのですがそれはナンセンスなのかどうか教えてください。
仮に大きいブロックを確保して、そこへどんどん値を保存していくと、そのうちブロックのサイズを超えて問題が起きると思うのですが、今何バイト使ってるとかいちいち確認して足りなくなったらまHeapAlloc()で確保すればいいのかな?それもそれでなんかなーって思うのですが。
詳しい人おせーてください。
No.2ベストアンサー
- 回答日時:
少しずつ大量にHeapAlloc するのは、
ナンセンスではないですが、ムダが多いです。
OS側では、確保したメモリの他に、どれだけ割り当てたのかなどの管理領域が必要になりますから、
数バイト単位でHeapAlloc すると、その数倍のメモリを消費することになります。
C言語の malloc 関数、C++の new 演算子などでは、
「OSから大量にまとめてメモリを確保したあと、プログラム側に小出しにする」
ようになっていますので、少しずつメモリを確保しても、HeapAlloc ほど効率は悪くなりません。
どうしても HeapAlloc を使わなければならない理由があるのでしたらしかたないですが、
そうでないなら、 malloc や new を使うべきです。
また、C++なら、STL の std::vector などのテンプレートライブラリを使えば、
メモリ確保管理を自動でやってくれますので、
ユーザープログラム側ではメモリ管理を気にする必要が無くなります。
C++なら、そういったテンプレートライブラリを積極的に使った方が格段にコーディングが楽になります。
回答ありがとうございます。
malloc や newを使う方が一般的なんですね。
C++のテンプレートライブラリに触れたことが無いので今後勉強します。
No.3
- 回答日時:
こんにちは。
1個のヒープハンドルを使用して、HeapAlloc()を呼び出せば、小さなメモリを大量に割り当てられる筈です。
ナンセンスかどうかと言う問題では無いような気もします。
と言うのも、ちまちま割り当てるにしろ、大量にプールするにしろ、malloc()やoperator new()で良く行われている事です。
当方の記憶では、MSVCにおいてmalloc()とoperator new()は、同一の割当て用内部関数へ転送します。
割当て用内部関数で行っている事はクリティカルセクションを使用し、スレッドセーフにした上で、「HeapAlloc()を呼び出し」て要求サイズを4の倍数へ拡大したサイズと、前後ガード用領域を一張羅に割り当てて、双方向リンクリストに入れて行く事です。
前後ガード用領域の内容は0xcdcdcdcdに初期化されます。この領域の内容が変わっていたりすると、かの「メモリブロックが壊れた事を示すランタイムエラー」のダイアログが表示されるようになっています。
ただしこれは、デバックビルドの場合ですので、リリースビルドの場合では、ガード用領域はありません(マクロで除去されるのか、別の割当て用内部関数を使用するのかまではチョッと分からんです)。
要は、どの様な割り当て方をするにしろ、普段malloc()やoperator new()で行っている事を、HeapAlloc()で行う事は一番飾りの無い状態であるという事です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- アプリ swiftでスマホアプリを開発した時の動作確認 1 2023/02/14 11:37
- 予備校・塾・家庭教師 3浪するんですが以下の4ルートだったらどれがいいですか? 2年間宅浪です。 ㅤ ●ルート① スマホ禁 3 2023/03/04 13:11
- 確定申告 扶養を抜けるには。 2 2023/05/29 11:16
- 減税・節税 国保➡社会保険に加入のがふるさと納税の恩恵がある? 3 2023/05/26 11:48
- 減税・節税 ふるさと納税返礼品制度を活用する為の方法 1 2023/05/23 15:56
- 保育士・幼稚園教諭 自由保育についてです。 うちの園は小規模で子どもの人数も 少ない小さな園です。 また、縦割りで0〜3 2 2022/07/27 19:51
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/21 09:28
- 数学 時々、回答者の見識に疑念を抱いてしまうんです。私だって本当は皆様のことを疑いたくはありません。しかし 2 2022/11/27 12:23
- その他(Microsoft Office) Excel、Wordのファイル 3 2023/05/07 04:58
- 中学校 比の文章題 2 2022/08/28 02:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GetCommandLineを使用しました。
-
void*型のデータサイズ
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
行列内の行の交換,列の交換を...
-
sprintf の使い方について
-
配列の添え字の最大数とは?
-
DLLのマルチスレッドの動作につ...
-
ポインタのポインタの初期化法
-
ヒープメモリの解放について
-
OpenCV cvLoadImageについて
-
Win32APIでのメモリ管理について
-
LoadLibraryでAccess Violation...
-
x64環境で連続4GB以上のメモリ...
-
c言語のメモリの確保について
-
VBからMFC-DLL呼び出し
-
LPTSTR型の変数に文字を格納
-
画像を読み込む配列の確保。
-
malloc呼び出し時のセグメンテ...
-
LPWSTRのコピー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
malloc呼び出し時のセグメンテ...
-
入れ子になった構造体について
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
void*型のデータサイズ
-
Win32APIでのメモリ管理について
-
配列の添え字の最大数とは?
-
C++のnewで確保したメモリーの...
-
プログラムが途中で強制終了し...
-
C言語 mallocとfreeについて
-
win32APIのHeapAlloc()の使い方...
-
LoadLibraryでAccess Violation...
-
グローバル変数のサイズ
-
MFCのCStringについて
-
メモリ不足になってしまう。
-
ヒープの実際の限界値は?
おすすめ情報