1

我有一个 C# 应用程序,我在其中创建了一个 3D Int16(short) 数组。想要将此 3D 数组传递给 C++ 库,以将此数据设置为 1D 字节数组形式的对象。因此,场景要么在将数据传递到库之前对其进行转换,要么在库本身中进行转换。

  • 我知道如何在 C# 中将 3D Int16 数组转换为 1D 字节数组,但我不知道如何使用 C++ 进行转换?
  • 关于我在 C# 中使用的 C++ 或 C#,哪一个会更快ConvertAll
  • 内存是否会翻倍,或者我可以将 C++ 库中的对象数据设置为指向我在 C# 中的相同卷?
4

1 回答 1

2

我知道如何在 C# 中将 3D Int16 数组转换为 1D 字节数组,但我不知道如何使用 C++ 进行转换?

这取决于您希望如何在一维数组中排列行、列和深度。我看不出有任何转换它的理由,因为您可以按照您想要的方式随机访问这些元素。当您不需要时,没有理由承担此类手术的费用。如果您不将其存储在文件中或通过网络发送它,我无法理解您为什么要序列化它。

为什么你不能这样做:

__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 代码更快。

内存是否会翻倍,或者我可以将 C++ 库中的对象数据设置为指向我在 C# 中的相同卷?

您应该能够通过引用将 C# byte[] 传递给 c++ 函数,而无需复制任何数据。不过,我们需要更多关于您到底想要做什么的详细信息。

于 2012-10-08T14:32:27.233 回答