memcpy와 memmove 두 함수는 모두 특정 메모리를 다른 메모리로 복사할 때 사용된다. 이번 포스팅에서는 두 함수의 사용법과 차이점에 대해 알아보자.
두 함수 모두 특정 메모리 주소에서 원하는 크기만큼 다른 곳으로 복사시켜 주고, memory.h 또는 string.h 헤더 파일에 포함되어 있다. 그럼 함수의 반환 타입과 인자값에 대해 조금 더 자세히 알아보자.
memcpy
void* memcpy (void* dest, void* src, size_t size);
- dest: 복사되는 메모리의 첫번째 주소
- src: 복사할 메모리의 첫번째 주소
- size: 복사할 크기 (byte)
- 반환값: 성공시 dest, 실패시 NULL
memmove
void* memmove (void* dest, void* src, size_t size);
- dest: 복사되는 메모리의 첫번째 주소
- src: 복사할 메모리의 첫번째 주소
- size: 복사할 크기 (byte)
- 반환값: 성공시 dest, 실패시 NULL
이렇게 비교하고보니 두 함수의 생김새가 똑같다는 것을 확인할 수 있다. 따라서 사용방법 또한 같다. 다음과 같이 2가지 char 배열이 할당되었다고 할 때, memcpy나 memmove를 사용하면 IHateYou라는 문장을 만들 수 있다.
char Love[10] = "ILoveYou";
char Hate[10] = "IHateMe";
memcpy(Love+1, Hate+1, 4);
memmove(Love+1, Hate+1, 4);
코드 결과를 보면 두가지 함수 모두 동일한 동작을 수행하여 잘 copy가 되고 있음을 확인할 수 있고, move라는 이름과 달리 원본도 잘 유지된다. 따라서 원하는 구간을 원하는 사이즈만큼 복사할 수 있다는 장점을 가지며, 그러므로 특정 배열을 다른 배열로 복사시키고 싶을 때 자주 사용한다. 즉, 다음과 같이 원래 배열의 인덱스에 하나하나 접근하여 복사해줘야 했던 점을 memcpy나 memmove를 이용하여 가독성을 살려주고, 수행 속도 또한 높일 수 있다.
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b[10];
for (int i = 0; i < 10; i++) {
b[i] = a[i];
}
|
|
|
V
memcpy(b, a, 10 * sizeof(int));
memcpy와 memmove의 차이
두 함수의 차이는 2가지 정도로 생각해볼 수 있다.
우선, memcpy는 메모리의 내용을 직접 copy하고, memmove는 copy할 메모리의 내용을 임시 공간에 저장한 후에 copy한다. 즉, memcpy의 속도가 더 빠르다는 것을 의미하고, 반면에 memmove는 더 안전하게 동작한다는 의미이다.
두번째로, memory를 copy할 때, memcpy의 경우에는 자기 자신의 내용을 copy하여 자기 자신에게 덮어쓸 때, 안전한 메모리에 의해 겹침 현상(overlap)이 발생한다.
위 그림에서 원래는 1,2,3,4,5,6,7,8,9,10 을 1, 1, 2, 3, 4, 5, 6, 7, 8, 9로 만들기를 원했으나, 결과는 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 가 나온다. 즉, memcpy는 단계적으로 바로바로 복사하기 때문에 한 개를 복사하고 나면 다음 복사할 메모리가 이미 바뀌어 있게 되는 인접한 메모리 문제 또는 메모리의 복사시 overlapping이 발생한다. 그리고 이러한 문제점을 안전하게 해결해주는 함수가 memmove이다. 이 함수는 임시공간에 복사할 내용을 저장해두고 거기에서 가져와 복사를 하기때문에 원본을 건드리지 않는다. 즉, 다음과 같이 통째로 복사하는 것과 같은 효과를 볼 수 있다.
하지만 최근 vscode에서는 memcpy의 이러한 문제점을 보완하여 memmove와 같이 이제 더이상 이런 오류는 발생하지 않는다.
인용
https://m.blog.naver.com/sharonichoya/220510332768
'Language > C' 카테고리의 다른 글
#if, #elif, #else, #endif와 #ifdef, #ifndef, #endif 지시문 (0) | 2023.11.11 |
---|---|
#define에 대해서 (0) | 2023.11.11 |
선언(declaration)과 정의(definition) (0) | 2023.11.05 |
구조체 (0) | 2023.11.05 |
키워드 _CRT_SEUCRE_NO_WARNINGS에 대하여 (0) | 2023.11.05 |