노주현 개인 블로그
Momory Copy 여러가지 방식 본문
Array Copy()
Array.Copy(srcData, 0, dstData, 0, size);
Buffer.BlockCopy()
Buffer.BlockCopy(srcData, 0, dstData, 0, size);
Marshal.Copy()
static unsafe void MarshalCopy(byte[] src, int srcOffset, byte[] dst, int dstOffset, int count)
{
fixed (byte* b1 = &src[0])
fixed (byte* b2 = &dst[0])
{
IntPtr ab2 = new IntPtr(b2);
Marshal.Copy(src, 0, ab2,count);
}
}
Cpp Copy Memory
using System.Runtime.InteropServices;
[DllImport("msvcrt.dll", SetLastError = false)]
static unsafe extern void* memcpy(void* dst, void* src, int count);
static unsafe void CppCopyMemory(byte[] src, int srcOffset, byte[] dst, int dstOffset, int count)
{
fixed (byte* pSrc = src, pDst = dst)
{
// 포인터를 고정하고 데이터 복사.
byte* ps = pSrc + srcOffset;
byte* pd = pDst + dstOffset;
memcpy(pd, ps, count);
//memcpyimpl(pd, ps, count);
}
}
Direct Copy
static void DirectCopy(byte[] src, int srcOffset, byte[] dst, int dstOffset, int count)
{
if ((src == null) || (dst == null))
{
throw new System.ArgumentException();
}
if ((srcOffset < 0) || (dstOffset < 0) || (count < 0))
{
throw new System.ArgumentException();
}
if ((src.Length - srcOffset < count) ||
(dst.Length - dstOffset < count))
{
throw new System.ArgumentException();
}
for (int i = 0; i < count; i++)
{
dst[dstOffset + i] = src[srcOffset + i];
}
}
UnSafe Copy
static unsafe void UnSafeCopy(byte[] src, int srcOffset, byte[] dst, int dstOffset, int count)
{
fixed (byte* pSrc = src, pDst = dst)
{
// 포인터를 고정하고 데이터 복사.
byte* ps = pSrc + srcOffset;
byte* pd = pDst + dstOffset;
for (int i = 0; i < count; i++)
{
*pd++ = *ps++;
}
}
}
UnSafe Copy INT
static public unsafe void UnSafeCopy_INT(byte[] src, int srcOffset, byte[] dst, int dstOffset, int count)
{
fixed (byte* b1 = &src[0])
fixed (byte* b2 = &dst[0])
{
unchecked
{
int intCount = count / sizeof(int);
int rest = (0 == intCount) ? count : (count % sizeof(int));
int* ps = (int*)(b1 + srcOffset), pd = (int*)(b2 + dstOffset);
// 한번에 4바이트 씩 복사
for (int n = 0; n < intCount; n++)
*pd++ = *ps++;
// 남은것 처리.
if (rest > 0)
{
byte* ps1 = (byte*)ps;
byte* pd1 = (byte*)pd;
for (int n = 0; n < rest; n++)
*pd1++ = *ps1++;
}
}
}
}
UnSafe Copy LONG
static public unsafe void UnSafeCopy_LONG(byte[] src, int srcOffset, byte[] dst, int dstOffset, int count)
{
fixed (byte* b1 = &src[0])
fixed (byte* b2 = &dst[0])
{
unchecked
{
int intCount = count / sizeof(long);
int rest = (0 == intCount) ? count : (count % sizeof(long));
long* ps = (long*)(b1 + srcOffset), pd = (long*)(b2 + dstOffset);
// 한번에 4바이트 씩 복사
for (int n = 0; n < intCount; n++)
*pd++ = *ps++;
// 남은것 처리.
if (rest > 0)
{
byte* ps1 = (byte*)ps;
byte* pd1 = (byte*)pd;
for (int n = 0; n < rest; n++)
*pd1++ = *ps1++;
}
}
}
}
Designer 에서 실행 결과
'프로그래밍 > C#' 카테고리의 다른 글
문자열 인코딩 (0) | 2022.01.21 |
---|---|
클래스 상속 - Interface (0) | 2022.01.18 |
Thread 관련 내용 총정리 (0) | 2022.01.05 |
Bitmap & Byte[] (0) | 2022.01.03 |
Process 실행 여부 확인 (0) | 2021.12.30 |
Comments