我在 C#
中有以下函数:
public Matrix ConcatDescriptors(IList<>> 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(concatedDescs);
}
我正在尝试将其翻译成C
hoặcC++
。我认为这很简单,但是,我被困在了线上:
Buffer.BlockCopy(descriptor.ManagedArray, 0, concatedDescs, offset, sizeof(float) * descriptor.ManagedArray.Length);
如何在 C
hoặc C++
中重新创建同一行代码?
在 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
)
Tôi là một lập trình viên xuất sắc, rất giỏi!