C#中的快速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.还有另一种更快的方法吗?
非常感谢。
选项#2被破坏,因为您指向的对象不再固定后使用指针。 在fixed
块内获得的指针只能在同一fixed
块内使用。 看起来你应该使用Marshal.UnsafeAddrOfPinnedArrayElement
(并且仅在fixed
数组的fixed
块内使用它)。
看看Buffer.BlockCopy
。