메모리 복사 명령은 전통적으로, 어셈블리 특성상 
인접한 상위 메모리에서 하위 메모리 즉 높은 번지의 메모리에서 낮은 번지의 메모리로 
복사하는 것이 자연스럽습니다. 
하지만 반대로 인접한 낮은 번지에서 높은 번지로 데이타를 복사 전송하는 것은 
한번에 안되고  각 메모리 내용을 높은 번지부터 아래로 하나씩 복사해주는 방법을 씁니다. 

이런 방법은 전송하는 메모리의 번지가 인접해 겹칠때 문제가 되기 때문입니다. 

이런 생각 없이 그냥 코딩해 볼까요. 
1
2
3
4
5
6
7
8
9
10
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 입니다. 

1
2
3
4
5
6
7
8
9
10
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를 돌며 데이타를 동일화 하지 않아도 된다는 것이죠. 

간단한 것이고 오래전에 알았는데 몇 년 안쓰다 보니 잊어버려서 
나이든 플머를 위해 기록해 둡니다.

 

출처 : http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=826

'IT > C' 카테고리의 다른 글

TODO, FIXME, XXX 태그의 의미  (0) 2017.05.18
전처리기를 알아보자  (0) 2014.05.21
poll과 select에는 대기큐가 존재한다.  (0) 2014.05.08

+ Recent posts