메모리 복사 명령은 전통적으로, 어셈블리 특성상
인접한 상위 메모리에서 하위 메모리 즉 높은 번지의 메모리에서 낮은 번지의 메모리로
복사하는 것이 자연스럽습니다.
하지만 반대로 인접한 낮은 번지에서 높은 번지로 데이타를 복사 전송하는 것은
한번에 안되고 각 메모리 내용을 높은 번지부터 아래로 하나씩 복사해주는 방법을 씁니다.
이런 방법은 전송하는 메모리의 번지가 인접해 겹칠때 문제가 되기 때문입니다.
이런 생각 없이 그냥 코딩해 볼까요.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
enum { Size = 10};
int data[Size];
for(int c = 0; c < Size; c++)
data[c] = c; // test data
memcpy(data, data + 1, sizeof(data) - sizeof(int)); // 1,2,3,4,5,6,7,8,9,9 이렇게 되죠.
memcpy(data + 1, data, sizeof(data) - sizeof(int)); // 1,1,1,1,1,1,1,1,1,1 이런 결과가 나옵니다.
}
하지만 이를 영리하게 처리해주는 함수가 있습니다.
즉 번지의 인접성을 전혀 걱정하지 않아도 정확하게 메모리 내용이 원하는 대로
복사되는 것은 memmove 입니다.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
enum { Size = 10};
int data[Size];
for(int c = 0; c < Size; c++)
data[c] = c;
memmove(data, data + 1, sizeof(data) - sizeof(int)); // 1,2,3,4,5,6,7,8,9,9 이렇게 되죠.
memmove(data + 1, data, sizeof(data) - sizeof(int)); // 1,1,2,3,4,5,6,7,8,9 이렇게 됩니다.
}
이렇게 잘 됩니다.
그런데
memcpy(data + 1, data, sizeof(data) - sizeof(int)); // 1,1,1,1,1,1,1,1,1,1.
이렇게 된다는 특성은, 메모리를 동일한 내용으로 채우는 가장 빠른 방법을 말해주는 것입니다.
일일이 for loop를 돌며 데이타를 동일화 하지 않아도 된다는 것이죠.
간단한 것이고 오래전에 알았는데 몇 년 안쓰다 보니 잊어버려서
나이든 플머를 위해 기록해 둡니다.
델파이나 C++Builder를 하는경우 CopyMemory , MoveMemory 라는게 있습니다.
그런데 Windows.pas 에 있는데 C++Builder의 명시적으로 Export 되어있지 않더군요
그래도 사용하는데는 지장이 없네요
vcl의 CopyMemory , MoveMemory 는 둘다 memmove처럼 내부적으로 move 방식을 이용합니다.
그런데 memmove와 다른것은 win32 system의 기본형인 4Byte(32bit)씩 copy하고
남은것은 1Byte씩 copy하구....
그래서 memcpy,memmove보다 CopyMemory,MoveMemory를 이용하는것이 빠를것입니다.
image(영상)처리같이 Copy/Move작업이 많은경우에는 CopyMemory,MoveMemory를 이용하는것이 좋을듯 합니다.