메모리 복사 명령은 전통적으로, 어셈블리 특성상
인접한 상위 메모리에서 하위 메모리 즉 높은 번지의 메모리에서 낮은 번지의 메모리로
복사하는 것이 자연스럽습니다.
하지만 반대로 인접한 낮은 번지에서 높은 번지로 데이타를 복사 전송하는 것은
한번에 안되고 각 메모리 내용을 높은 번지부터 아래로 하나씩 복사해주는 방법을 씁니다.
이런 방법은 전송하는 메모리의 번지가 인접해 겹칠때 문제가 되기 때문입니다.
이런 생각 없이 그냥 코딩해 볼까요.
하지만 이를 영리하게 처리해주는 함수가 있습니다.
즉 번지의 인접성을 전혀 걱정하지 않아도 정확하게 메모리 내용이 원하는 대로
복사되는 것은 memmove 입니다.
이렇게 잘 됩니다.
그런데
memcpy(data + 1, data, sizeof(data) - sizeof(int)); // 1,1,1,1,1,1,1,1,1,1.
이렇게 된다는 특성은, 메모리를 동일한 내용으로 채우는 가장 빠른 방법을 말해주는 것입니다.
일일이 for loop를 돌며 데이타를 동일화 하지 않아도 된다는 것이죠.
간단한 것이고 오래전에 알았는데 몇 년 안쓰다 보니 잊어버려서
나이든 플머를 위해 기록해 둡니다.
인접한 상위 메모리에서 하위 메모리 즉 높은 번지의 메모리에서 낮은 번지의 메모리로
복사하는 것이 자연스럽습니다.
하지만 반대로 인접한 낮은 번지에서 높은 번지로 데이타를 복사 전송하는 것은
한번에 안되고 각 메모리 내용을 높은 번지부터 아래로 하나씩 복사해주는 방법을 씁니다.
이런 방법은 전송하는 메모리의 번지가 인접해 겹칠때 문제가 되기 때문입니다.
이런 생각 없이 그냥 코딩해 볼까요.
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 |