gpt4 book ai didi

c# - 如何在 C# 中复制非托管数据,速度有多快?

转载 作者:可可西里 更新时间:2023-11-01 07:51:39 25 4
gpt4 key购买 nike

我有两个 IntPtr 形式的非托管指针,想在它们之间复制数据。我怎样才能做到这一点?我知道 Marshal.Copy 方法,但它只能在非托管和托管之间进行复制。第二部分:从 C# 复制非托管数据是否比使用 memcpy 在非托管 C/C++ 中复制慢?


编辑:我对独立于平台的实现特别感兴趣。

最佳答案

您可以使用 win32 memcpy通过 P-Invoke 函数。

[DllImport("msvcrt.dll",  SetLastError = false)]
static extern IntPtr memcpy(IntPtr dest, IntPtr src, int count);

除了从托管代码调用 win32 函数的(轻微)开销外,实际的复制性能应该与使用相同函数的 C/C++ 代码相同。

不要忘记,您还可以使用不安全 block (和编译器选项)并一次简单地复制一个字节/整数/长数据:

unsafe
{
// srcPtr and destPtr are IntPtr's pointing to valid memory locations
// size is the number of long (normally 4 bytes) to copy
long* src = (long*)srcPtr;
long* dest = (long*)destPtr;
for (int i = 0; i < size / sizeof(long); i++)
{
dest[i] = src[i];
}
}

这消除了平台依赖性,但您需要非常小心边界检查和指针算法。

关于c# - 如何在 C# 中复制非托管数据,速度有多快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2658380/

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