人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

.NET Framework クラス ライブラリの下の2つのアンマネージメモリ確保APIの違いを教えて下さい。
・Marshal.AllocHGlobal
・Marshal.AllocCoTaskMem

COMタスクメモリアロケータでメモリを確保する場合と、
グローバルに(?)メモリを確保する場合とでその確保の内部処理に
何の違いがあるかとか、確保されるメモリ領域にどんな性質(確保される場所)の
違いがあるのか、、など、自身にそのあたりの知識が皆無なのが災いしてます。。。

2つのAPIを各々使ってみると、動作に明らかな違いが出るので気になっています。

●質問者: i_ogi
●カテゴリ:コンピュータ
✍キーワード:.NET Framework API クラス グローバル タスク
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● espresso3389
●200ポイント ベストアンサー

これらは、単純に、Win32 APIの

GlobalAlloc

CoTaskMemAlloc

の呼び出しを内部で行っています。

Win32には、他にも、LocalAlloc, HeapAlloc, VirtualAllocなどやたらとメモリ確保のAPIがあります。

このなかで、GlobalAlloc/LocalAllocは非常に古くから存在するAPIで、正直なところ、クリップボードや、ドラッグアンドドロップなどの一部の処理で必要になることを除けば、積極的に使うことは控えるべきAPIです。さらに、その処理もきわめて遅いです。

CoTaskMemFreeは、COMやシェルの処理でよく出てくるメモリ管理ルーチンで、結局、内部では、IMallocを利用しています。こちらは、少なくとも、COMのプログラミング中では、普通に利用することも多くあり、単純にGlobalAllocと比較するのであれば、こちらを利用する方が良いでしょう。

一方で、Win32の通常のアプリケーションでは、malloc, newを使ってメモリを確保しますが、これらは、内部でHeapAllocを使っています。HeapAllocはヒープというメモリ管理の概念を提供しており、このヒープのおかげで、自由なサイズのメモリを確保できることができるようになっています。CoTaskMemAlloc/IMallocも内部では、結局、HeapAllocを使っているのだと思われます。

そして、VirtualAllocは、この中では、もっとも低レベルのAPIで、逆に言えば、上記のすべてのAPIが最終的にはこのAPIかあるいは、このAPIとほぼ同一のカーネルAPIによって実装されていると考えても良いAPIです。このAPIは、仮想メモリに対する広範囲な理解がないと利用が難しいだけでなく、ページという単位(普通は、4KB)でしかメモリを確保できません。従って、たとえば、16バイトのメモリを確保するとなると、VirtualAllocで4KB単位のメモリを確保した上で、自分でメモリの切り盛り(これこそがヒープの役割)をすることになります。

以上で、おおよそのWin32のメモリ管理のイメージが分かると思うのですが、結局は適材適所で使い分けることが重要です。

しかしながら、通常は、そんなことは気にせずに.NETのメモリ管理を利用するのが一番簡単で、もっとも適切だと思われます。

逆に、COMに渡すメモリを確保したいだとか、クリップボード関連のAPIを使いたいなど、具体的な目的があれば、どのAPIを使うべきかは必然的に決まってきます。これは、APIの優劣などではなく、単純に相手にあわせる必要があるからです。

◎質問者からの返答

似たような質問が氾濫気味にあって、ほとんとがごまかされた感じというか、

すっきり理解できていませんでした。

丁寧にまとめていただいて、頭の中で散在していた情報が整理できた感じです。

また具体例まで示して頂いてとても参考になりました。

ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ