電子書籍の厳選無料作品が豊富!

教えて!goo検索で、
「ヒープ領域の限界値設定」を検索すると出てくる質問内容に対する回答No.2(ベストアンサー)について、
もう少し知りたいです。(私の質問ではないのですが。)
Visual C++のHeapAllocの場合、
ヒープ領域はOSが一緒くたに管理している領域から、個別のプログラムに割り当てられるのでしょうか?
ヒープというのがどういう場所にあるのかイメージしたいです。

プログラム起動時にシーケンシャルにそのプログラム用の、
(1)プログラム・スタック用領域・ヒープ領域が容易されるものなのか、
(2)プログラム・スタック用領域はシーケンシャルな領域が確保されて、
  ヒープはOSが一括管理している共有の領域をもらうのか、
どちらなのでしょうか。
コンパイラや、OSによって違うものなのでしょうか?
普通に考えると(2)のような気がするのですが…。

A 回答 (1件)

>ヒープ領域はOSが一緒くたに管理している領域から、個別のプログラムに割り当てられるのでしょうか?



物理メモリのことを言っていますか?

Windowsなら、それぞれのプロセスは独自の「メモリ空間」を割り当てられます。
読み込んだプログラム本体や、共有するDLL、スタック領域、ヒープ領域などなどがこのメモリ空間内にマッピングされることになります。
# ちなみに実行ファイル(EXEファイルやDLL)には、読み込んだときに効率よく配置できるようベースアドレスが設定されています。
# ベースアドレスに読み込めた場合はアドレスの再割り当ては不要ですが、そのメモリブロックが使用中の場合は
# 別のアドレスに割り当てし直されるので、ちょっつとだけロード時の処理が増えます。
# Dependency Walker等で確認できます。

ということで…概ね
>(1)プログラム・スタック用領域・ヒープ領域が容易されるものなのか
こちらになるかと。

起動時、最初にHeapAlloc()して取得したメモリアドレスを表示するプログラムを作成して多重起動させてみると判るかと。
ついでにインスタンスハンドルも表示してみたり。
# Win32ではモジュールのロードアドレス…のようです。
# 実行ファイルに記録されているロードアドレスはリンカで指定できます。

細かいところはWindowsの内部動作とか解説している書籍などを当たって下さい。
    • good
    • 0
この回答へのお礼

レスありがとうございます。

どうも私がイメージしていたものは間違いであったようですね。
教わりましたことを参考に、調べてみます。

お礼日時:2011/01/26 20:46

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