0

我想用这样的原型编写一个 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;
}

问题:

A. 我猜选项 2 比选项 1 快,对吗?

B. 还有其他更快的方法吗?

非常感谢。

4

1 回答 1

6

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

看看Buffer.BlockCopy

于 2013-04-12T04:22:43.467 回答