• ベストアンサー

移動可能メモリ

GlobalAlloc関数を調べていたんですが、GlobalLockしてメモリを固定するといっているのですが、その意味がピンときません。 GMEM_MOVEABLEで移動可能メモリの割り当てを行うようなんですが、 アドレスが移動するってどういうことなんでしょう? 固定メモリと移動可能メモリの違いってなんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • onosuke
  • ベストアンサー率67% (310/456)
回答No.1

まず、GlobalAlloc()やLocalAlloc()がWindowsの歴史的な経緯から残っている遺物で、今の時代にはそぐわないものだということを知っておいてください。 # Windows3.X時代、16bit CPUにあわせたメモリ管理の仕組み # に対応したものです。 >アドレスが移動するってどういうことなんでしょう?  「OSによって、データ格納先アドレスが勝手に変更される可能性がある」 ということです。(メモリデフラグ処理が原因) GMEM_FIXEDやGlobalLock()は、  「今から、データ格納先のアドレスポインタをプログラム内で保持します。だから、勝手にデータ格納先アドレスを変更しないでください」 というプログラムからOSへの宣言です。 # プログラムは、「アドレス10番地にデータが格納されている」 # と思っているのに、OSが勝手にアドレス10番地からアドレス20番地へ # データを移動させちゃったら困りますよね? >固定メモリと移動可能メモリの違いってなんでしょうか? プログラムからOSへの宣言の違いです。  ・固定メモリ…絶対、OSで勝手にデータ格納先アドレスを変更するな!!!  ・移動可能メモリ…プログラムで使っていない間は、OSが自由にデータ格納先アドレスを変更しても良いよ。  但し、上記の話「メモリデフラグ処理でデータ格納先のアドレスが勝手に変更される」が該当するのは、昔のWindowsだけです。  後継のWindowsNT,2000,XPでは、メモリデフラグを行っても、プログラムから見たデータ格納先アドレス(仮想アドレス)は変化しません。実際のデータ格納先アドレス(物理アドレス)が変化するだけです。  つまり、現在のCPUでは「GlobalLockしてメモリを固定するといっている」こと自体、必要ない処理、無駄な処理になります。  HeapAlloc()を利用しましょう。

dotneer
質問者

お礼

GlobalAlloc関数が昔から使われていたWindowsでの仕様を考えたもの だったんですね。  移動可能メモリというのはメモリデフラグ処理というのが絡んでいたんですね。 とてもよく分かりました。 ありがとうございます。

関連するQ&A