1

3D Int16(short) 配列を作成した C# アプリケーションがあります。この 3D 配列を C++ ライブラリに渡して、このデータを 1D バイト配列の形式でオブジェクトに設定します。したがって、シナリオは、データをライブラリに渡す前に変換するか、ライブラリ自体で変換するかのいずれかです。

  • C# で 3D Int16 配列を 1D バイト配列に変換する方法は知っていますが、C++ を使用して変換する方法がわかりません。
  • C#で使用することに関して、C++とC#のどちらが高速になりますConvertAllか?
  • メモリは 2 倍になりますか、それとも C++ ライブラリのオブジェクトのデータを C# と同じボリュームを指すように設定できますか?
4

1 に答える 1

2

C# で 3D Int16 配列を 1D バイト配列に変換する方法は知っていますが、C++ を使用して変換する方法がわかりません。

これは、1 次元配列で行、列、深さをどのように配置するかによって異なります。必要な方法で要素にランダムにアクセスできるため、変換する理由はありません。必要がないのに、そのような操作のコストを負担する理由はありません。これをファイルに保存したり、ネットワーク経由で送信したりしていない場合、なぜシリアル化する必要があるのか​​ 理解できません。

次のようなことができないのはなぜですか:

__declspec( dllexport ) void cppMatrixCode(__int16*** matrix_3d, int width, int height, int depth)
{
   //manipulate the matrix with matrix_3d[the row you want][col you want][depth you want]

   //or to serialize:
   for(int i = 0; i < width; i++)
     for(int j = 0; j < height; j++)
       for(int k = 0; k < depth; k++)
       {
         _int16 value = matrix_3d[i][j][k];
         //now add value to another array or whatever you want.
       }
}

in C#
[DllImport("YourDLLGoesHere")]
static extern void cppMatrixCode(short[,,] matrix_3d, int width, int height, int depth);

short[,,] matrix = new short[width, height, depth];
//add your values to matrix
cppMatrixCode(matrix, width, height, depth);

これは、32 ビット システムでは 128 バイト、64 ビット システムでは 160 バイトのみをコピーする必要があります。

C# で ConvertAll を使用することに関して、C++ と C# のどちらが高速でしょうか?

これは具体的に何を行っているかによって異なりますが、よく書かれた C++ コードは通常、CLI コードよりも高速です。

メモリは 2 倍になりますか、それとも C++ ライブラリのオブジェクトのデータを C# と同じボリュームを指すように設定できますか?

データをコピーせずに、参照によって C# byte[] を c++ 関数に渡すことができるはずです。繰り返しになりますが、あなたが何をしようとしているのかについて、より詳細な情報が必要です。

于 2012-10-08T14:32:27.233 に答える