gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:45:25 31 4
gpt4 key购买 nike

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

关于c# - C/C++ - 如何将 Buffer.BlockCopy (C#) 转换为 C/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21865836/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com