C/C++ - 如何将 Buffer.BlockCopy (C#) 转换为 C/C++
Posted
技术标签:
【中文标题】C/C++ - 如何将 Buffer.BlockCopy (C#) 转换为 C/C++【英文标题】:C/C++ - How can I convert Buffer.BlockCopy (C#) to C/C++ 【发布时间】:2014-02-18 21:32:00 【问题描述】:我在C#
中有如下函数:
public Matrix<float> ConcatDescriptors(IList<Matrix<float>> descriptors)
int cols = descriptors[0].Cols;
int rows = descriptors.Sum(a => a.Rows);
float[,] concatedDescs = new float[rows, cols];
int offset = 0;
foreach (var descriptor in descriptors)
// append new descriptors
Buffer.BlockCopy(descriptor.ManagedArray, 0, concatedDescs, offset, sizeof(float) * descriptor.ManagedArray.Length);
offset += sizeof(float) * descriptor.ManagedArray.Length;
return new Matrix<float>(concatedDescs);
我正在尝试将其翻译为C
或C++
。我认为这很简单,但是,我被卡住了:
Buffer.BlockCopy(descriptor.ManagedArray, 0, concatedDescs, offset, sizeof(float) * descriptor.ManagedArray.Length);
如何在C
或C++
中重新创建同一行代码?
【问题讨论】:
【参考方案1】:在 C 中,等价于 memcpy
。
在 C++ 中你仍然可以使用memcpy
,还有std::copy
。
请注意,C 和 C++ 允许指针(或迭代器)进入数组的中间,因此虽然 C# 将句柄传递给整个数组和起始索引,但在 C 和 C++ 中,您需要进行指针运算以找到调用函数之前的开始。
还要注意字节数与对象数。 Buffer.BlockCopy
测量起始索引和项目数(以字节为单位)。 memcpy
也以字节为单位测量项目数。 std::copy
在元素中测量。并且 C 和 C++ 指针算术对元素的数量进行操作。如果您首先将指针转换为char*
,那么元素和字节将变得相同。 (C 和 C++ char
正好是一个字节,不像 C# char
更像 C++ wchar_t
)
【讨论】:
以上是关于C/C++ - 如何将 Buffer.BlockCopy (C#) 转换为 C/C++的主要内容,如果未能解决你的问题,请参考以下文章