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++ 関数に渡すことができるはずです。繰り返しになりますが、あなたが何をしようとしているのかについて、より詳細な情報が必要です。