我想用这样的原型编写一个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中。还有另一种更快的方法吗?
非常感谢。
答案 0 :(得分:6)
选项#2被破坏,因为你指向的对象不再被修复后使用指针。在fixed
块内获得的指针只能在同一fixed
块内使用。看起来你应该使用Marshal.UnsafeAddrOfPinnedArrayElement
(并且仅在固定数组的fixed
块内使用它。)