void CopyMemory( _In_       PVOID  Destination, _In_ const VOID   *Source, _In_       SIZE_T Length );



약간 낚시성 제목 같지만 거짓말은 아니니 뭐....


알다시피 CopyMemory의 기본 호출 구조는 위와 같음.


내가 이상하다고 여기는건,

"하나의 배열"에서 밀어붙일때 얘기임.



{1,2,3,4,5} 라는 int배열이 있다고 치자.


Case 1)

CopyMemory(0번주소, 2번주소, 3*sizeof(int));

의 결과는 {3,4,5,4,5} 

Case 2)

CopyMemory(2번주소, 0번주소, 3*sizeof(int));

의 결과는 {1,2,1,2,3} 



Case 1의 결과는 반론의 여지가 없음.
문제는
Case 2의 결과가 이해가 안됨.


CopyMemory는 "바이트 단위"복사 아님?

그러면, 변화 단계가 아래와 같을거 같은데

{1,2,3,4,5}

{1,2,1,4,5}

{1,2,1,2,5}

{1,2,1,2,3} or {1,2,1,2,1}



마지막 단계에서

원하는 결과와 실제 결과는 당연히 전자임.

그런데 바이트복사라면 실제결과가 후자가 되어야할거 같은데,

다행히도(?) 정상적으로 전자가 됨.


2번주소 자리에 이미 1이 덮어씌워진거라고 생각했는데 결과를 볼때 먼저 덮어씌운게 아님.

저게 말하는건 다른 임시 배열을 만들어두고 거기 복사하고 다시 원래 주소로 덮어씌웠다는 생각이 드는데,

이러면 기본적으로 속도 때문에 쓰는건데 느려지는거 아님?

게다가 양 적을때는 상관없겠지만, 양 많으면 여유가 어느정도 있는 상태인데도 메모리 부족 발생하는거 아님?


누가 CopyMemory 구조 좀 설명해주세여 ㅠㅠ