C USBメモリと非ホストメモリの間の変換の例を説明します。
自分のメモリ回収メカニズムがありますので、cxiの中でnewだけできます。どのようにdeleteを使うかは気にしなくてもいいです。cxiはgcを使ってメモリを整理しています。この部分のメモリはmanage d memoryです。ほとんどの時はc繫環境で作業します。(例えば、私たちは第三者のc++またはnativeコードのライブラリを導入しなければならないかもしれません。Unity 3 d開発ではよく見られます。)直接にcxiで管理しないコードを操作する必要があります。これらのnon-manage d memoryは自分で申請を処理し、釈放します。c溿中にいくつかのインターフェースを提出して、委託管と非管理の間の変換を完成します。この部分のメモリの操作を行います。
基本的に以下の種類があります。
1.manage d memory->unmanage d memory
例えば、cxiでサードパーティのあるc++ライブラリを呼び出します。ライブラリにはvoid func(float*data、int length)という関数があります。ダタに伝えたいのは、委託しないコードであるべきです。まず、委託管のメモリに入ると、cxi層はgcを落としてしまいますが、c++はまだ使われています。そして、委託管のmemの針の住所が変更される可能性があります。したがって、直接にc+++に送る住所は間違っています。
コードは以下の通りです
c+++の中で一つのun-manage d memを返してcciに使います。C+++に処理したメモリを割り当てて、c+++のいずれかのインターフェースint func(int*data)に戻す必要がある場合があります。
時には直接にcxiで1つの非委託管のメモリを開けて、c+に伝えて使って、このメモリは同様にcxiの中で使った後で廃棄することができます。コードは以下の通りです
コメント
委託管理メモリと非委託管の中にはc铅があります。主にMarksharl類とGCHandle類を通して、プログラミングする時は委託管理でないメモリに注意してください。皆さんの応援に感謝します。
基本的に以下の種類があります。
1.manage d memory->unmanage d memory
例えば、cxiでサードパーティのあるc++ライブラリを呼び出します。ライブラリにはvoid func(float*data、int length)という関数があります。ダタに伝えたいのは、委託しないコードであるべきです。まず、委託管のメモリに入ると、cxi層はgcを落としてしまいますが、c++はまだ使われています。そして、委託管のmemの針の住所が変更される可能性があります。したがって、直接にc+++に送る住所は間違っています。
コードは以下の通りです
using System.Runtime.InteropServices;
float[] _managed_data =... // this is the c# managed data
GCHandle unmanaged_data_handle = GCHandle.Alloc(_managed_data, GCHandleType.Pinned); // _managed_data gc ,
func(unmanaged_data_handle.AddrOfPinnedObject(),_managed_data.Length);// , c++
unmanaged_data_handle.Free();// , handle free, c# gc
2.un-manage d memory->managed memoryc+++の中で一つのun-manage d memを返してcciに使います。C+++に処理したメモリを割り当てて、c+++のいずれかのインターフェースint func(int*data)に戻す必要がある場合があります。
IntPtr unmanaged_ptr=IntPtr.Zero; // c# c++
int length = func(out unmanaged_ptr );// c++ , unmanaged_ptr c++ , out , c++ ** 。
byte[] managed_data = new byte[length];
Marshal.Copy(unmanaged_ptr, managed_data, 0, length);// , c#
Marshal.FreeHGlobal(unmanaged_ptr);//
3.c萶で直接にun-manage d memを申請してc++に伝えます。時には直接にcxiで1つの非委託管のメモリを開けて、c+に伝えて使って、このメモリは同様にcxiの中で使った後で廃棄することができます。コードは以下の通りです
IntPtr unmanaged_data_prt = Marshal. AllocHGlobal(100);// 100 byte
func(unmanaged_data_prt);// c++
Marshal.FreeHGlobal(unmanaged_data_prt);
この他にもMasharl類には多くの非信託メモリを処理する方法があります。コメント
委託管理メモリと非委託管の中にはc铅があります。主にMarksharl類とGCHandle類を通して、プログラミングする時は委託管理でないメモリに注意してください。皆さんの応援に感謝します。