C#中的快速memcpy

时间:2013-04-12 04:20:27

标签: c# performance memcpy

我想用这样的原型编写一个C#方法:

void memcpy(byte[] dst, int dstOffset, byte[] src, int srcOffset, int len);

此方法有2个选项:

1

void memcpy(byte[] dst, int dstOffset, byte[] src, int srcOffset, int len)
{
    for (int i = 0; i < len; i++)
    {
        dst[dstOffset + i] = src[srcOffset + i];
    }
}

2

void memcpy(byte[] dst, int dstOffset, byte[] src, int srcOffset, int len)
{
    IntPtr intPtr = getIntPtr(dst, dstOffset);
    System.Runtime.InteropServices.Marshal.Copy(src, srcOffset, intPtr, len);
}

IntPtr getIntPtr(byte[] buffer, int offset)
{
    IntPtr intPtr;
    unsafe
    {
        fixed (byte* p1 = buffer)
        {
            byte* p2 = p1 + offset;
            intPtr = (IntPtr)p2;
        }
    }
    return intPtr;
}

问题:

一个。我猜选项2比选项1快,是不是?

B中。还有另一种更快的方法吗?

非常感谢。

1 个答案:

答案 0 :(得分:6)

选项#2被破坏,因为你指向的对象不再被修复后使用指针。在fixed块内获得的指针只能在同一fixed块内使用。看起来你应该使用Marshal.UnsafeAddrOfPinnedArrayElement(并且仅在固定数组的fixed块内使用它。)

查看Buffer.BlockCopy