memmove : 어떠한 경우에도 사용할 수 있는 메모리 복사 함수.

: momory와 move의 합성어이다. 메모리에 저장된 데이터를 다른 영역으로 이동하는 함수이다. (여기서 말하는 이동은 복사를 의미)


#include<string.h>

void* memmove(void* dest, const void*, size_t len);

매개변수 dest로 전달된 주소 값이 그대로 반환.


매개변수 src로 전달된 값을 시작주소로 하여 len 바이트를 읽어 들여서, 매개변수 dest로 전달된 주소에 복사.



 주의해야 할 사항: 복사의 대상이 되는 메모리 공간의 크기가 복사할 바이트의 수보다 작다면 문제가 발생하기 때문에 복사의 대상이 되는 메모리 공간의 크기가 작게 할당되는 일이 없어야 한다.



memcpy : 제한된 상황에서의 메모리 복사. memmove보다 빠르다.


:memory와 copy의 합성어이다. 역시 메모리에 저장된 데이터를 다른 영역으로 복사하는 기능을 제공한다.

#include <string.h>

void* memcpy(void* restrict dest, const void* restrict src, size_t len);

매개변수 dest로 전달된 주소 값이 그대로 반환된다.


memmove 함수와의 차이점 : 위 함수의 매개변수 선언을 보면 dest와 src가 restirct로 선언되었음을 알 수 있다. 따라서 함수가 호출되면서 dest와 src로 전달된 주소 값의 메모리는 각각 dest와 src로만 접근이 가능해야한다.


 복사할 때 메모리가 겹치는 경우, memcpy 함수를 사용해서 원하는 결과를 얻지 못한다. 왜냐하면 restrict로 선언된 포인터가 가리키는 메모리 영역은 해당 포인터로만 접근이 허용되기 때문이다. (복사할 대상에 다른 포인터가 가리키고 있기 때문에.)

이럴때는 memmove 함수를 사용해야 원하는 결과를 얻을 수 있다.

반면에 겹치지 않는 상황이라면, memcpy 함수를 사용 함으로서 성능의 향상을 기대할 수 있다.



※ memcpy가 memmove보다 빠른 이유


: 복사 원본과 복사 대상이 겹치는 경우의 복사는 겹치지 않는 경우의 복사보다 시간과 메모리를 더 많이 요구한다. 뿐만 아니라 복사 원본과 복사 대상이 겹치는지 겹치지 않는지를 확인하는 것도 부담되는 일이다. 이처럼 memmove 함수는 다양한 부담을 안고 동작하도록 디자인 되어있다.

반면 복사 원본과 복사 대상이 겹치지 않는다는 확신이 있다면, 지금 말한 함수의 부담을 덜어 줄 수 있다. 때문에 그만큼 고속으로 복사가 이뤄지도록 함수의 구현이 가능하다.


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

함수 포인터를 반환하는 함수의 정의  (0) 2013.02.15
함수 포인터  (0) 2013.02.15
volatile 과 restict  (0) 2013.02.15
const 키워드  (0) 2013.02.15
힙에 할당된 메모리의 확장 시 호출하는 realloc 함수.  (0) 2013.02.15
Posted by scii
: