노주현 개인 블로그

Momory Copy 여러가지 방식 본문

프로그래밍/C#

Momory Copy 여러가지 방식

해인아빠408 2022. 1. 3. 17:45

 

TestMemoryCopy.zip
0.01MB

 

 

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