最終更新:2017-12-19 (火) 14:45:07 (2318d)
プラットフォーム呼び出し/ポインタ
Top / プラットフォーム呼び出し / ポインタ
IntPtr
関数の戻り値がポインタの場合
- Marshal.Copy(ptr, arr, 0, size);
引数がポインタの場合
- Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * size);
- Marshal.AllocHGlobal
メモリの確保
- 確保する元のヒープが2種類ある
- Marshal.AllocHGlobal allocates from the process heap, Marshal.AllocCoTaskMem allocates from the COM heap.
- https://stackoverflow.com/questions/1887288/marshal-allochglobal-vs-marshal-alloccotaskmem-marshal-sizeof-vs-sizeof
Marshal.AllocCoTaskMem
- 内部はCoTaskMemAlloc
- COMタスクメモリアロケータを利用
Marshal.AllocHGlobal
- 内部はLocalAlloc (Win16との互換性のために残ってる)
- LocalAllocのメモリ管理の実態はGlobalAlloc?と同じもの
- GlobalAlloc?もクリップボードやDDEといったレガシーサポートの為で、それ以外の用途にはパフォーマンス等の理由で推奨されていない