C/C++ - 如何将 Buffer.BlockCopy (C#) 转换为 C/C++

C/C++ - How can I convert Buffer.BlockCopy (C#) to C/C++

本文关键字:C++ 转换 Buffer BlockCopy      更新时间:2023-10-16

我在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);
}

我正在尝试将其翻译成CC++.我认为这相当简单,但是,我被困在了线上:

Buffer.BlockCopy(descriptor.ManagedArray, 0, concatedDescs, offset, sizeof(float) * descriptor.ManagedArray.Length);

如何在CC++中重新创建同一行代码?

在 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