본문 바로가기
C,C++/정보정리

[C/C++] 메모리 관련 함수(memcpy, memmove, memcmp)

by 마두식 2022. 9. 6.
반응형

※ 포스팅에 들어가기 앞서 아래 내용은 C언어를 기준으로 작성한 내용입니다. 아래는 참고 링크입니다.

- 씹어먹는 C 언어 - <20 - 2. 메모리 동적할당 + 메모리 갖고 놀기> (modoocode.com)

 

메모리를 직접적으로 이용하는 함수들 중 memcpy, memmove, memcmp 에 대해서 정리해보도록 하겠습니다.

이 함수들은 string.h 에 정의되어 있습니다.

 

 


 

memcpy

 

memcpy는 이름에서 알 수 있듯이(memory + copy) 메모리의 값을 복사하는 함수입니다.

함수의 원형은 다음과 같습니다.

 

void* memcpy(void* dest, const void* source, size_t n)

 

첫번째 인자 dest

-  데이터를 복사받을 메모리를 가리키는 포인터

 

두번째 인자 source

-  복사할 메모리를 가리키고 있는 포인터

 

세번째 인자 n

-  복사할 메모리 크기(byte 단위)

 

리턴값

-  첫번째 인자인 dest가 리턴된다.

 

=>  두번째 인자(source)를 n byte만큼 복사해서 첫번째 인자(dest)에 복사해서 붙여넣는 함수.

 

 

memmove

 

memmove는 메모리의 값을 이동하는 함수입니다.

함수의 원형은 다음과 같습니다.

 

void* memmove(void* dest, const void* source, size_t n)

 

첫번째 인자 dest

-  데이터를 복사받을 메모리를 가리키는 포인터

 

두번째 인자 source

-  복사할 메모리를 가리키고 있는 포인터

 

세번째 인자 n

-  복사할 메모리 크기(byte 단위)

 

리턴값

-  첫번째 인자인 dest가 리턴된다.

 

=>  두번째 인자(source)를 n byte만큼 복사해서 첫번째 인자(dest)에 복사해서 붙여넣는 함수.

 

※ memcpy와 memmove의 차이가 무엇인지는 아래에서 알아보도록 하겠습니다

 

 

memcmp

 

memcmp는 메모리의 값을 비교하는 함수입니다.

함수의 원형은 다음과 같습니다.

 

int memcmp(const void* ptr1, const void* ptr2, size_t n)

 

첫번째, 두번째 인자 (ptr1, ptr2)

-  메모리 블럭을 가리키는 포인터

 

세번째 인자 n

-  비교할 메모리 크기(byte 단위)

 

리턴값

-  두 메모리 블럭이 일치한다면 0을 리턴

-  ptr1과 ptr2가 가리키는 메모리 블럭을 앞에서부터 비교했을 때, 제일 처음으로 다른 바이트가 unsigned char로 해석해서 값이 ptr1이 더 크면 양수를, ptr1이 더 작으면 음수를 리턴한다.

 

=>  ptr1과 ptr2에서 n byte만큼 비교하여 같은지 다른지를 계산하는 함수.

 

 


 

memcpy, memove 차이

 

1. memcpy는 source 메모리의 내용을 바로 destination에 복사한다. 하지만 memmove는 source 메모리의 내용을 임시 공간에 저장한 후 destination에 복사한다.

 

=>  즉, 속도는 memcpy가 더 빠르지만 안전하게 동작하는 것은 memmove이다.

 

속도가 더 빠르다는 것은 이해하기 쉽지만 안전하게 동작한다는 말은 선뜻 이해하기 어렵습니다.

예를 들어서 설명해보도록 합시다.

 

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>
 
int main() {
    int a[10= { 12345678910 };
    memcpy(a + 1, a, 9 * sizeof(int));
    for (int i = 0; i < 10; i++) {
        printf("%d ", a[i]);
    }
    
    return 0;
}
cs

 

사용자가 원하는 결과는 { 1, 1, 2, 3, 4, 5, 6, 7, 8, 9 } 라고 했을 때, 위의 코드로 확인을 하면 어떨까요?

원하는 결과가 아닌 { 1, 1, 1, 1, 1, 1, 1, 1, 1 } 이 나올 수도 있습니다.

즉, memcpy의 경우 위와 같이 메모리가 중첩되는 겹침 현상(overlap)이 발생할 경우 사용자가 원하는 대로 동작하지 않을 수도 있습니다.

하지만 memmove의 경우 복사할 내용을 임시 공간에 먼저 저장한 후 destination에 복사가 이루어지므로 메모리 겹침 현상이 발생해도 사용자가 원하는 대로 정확하게 동작을 합니다.

이것이 위에서 memmove가 더 안전하게 동작한다고 말한 이유입니다.

 

※  단, 위에서 원하는대로 동작하지 않을 수도 있다 라고 표현한 것은 memcpy의 겹침현상 문제를 컴파일러에서 해결해주는 경우도 있기 때문입니다.

 

아래는 memcpy와 memove를 사용자가 직접 구현하여 정리한 블로그 링크입니다. (제가 작성한 내용이 아닙니다)

아래의 링크에서도 memcpy와 memove 코드 각각에서 메모리 겹침 현상이 발생할 때 해당 문제에 대한 처리가 되는지를 중점적으로 보시면 좋을 것 같습니다.

 

C++에서 memcpy 와 memmove 의 차이 점 요약 (intrepidgeeks.com)

 

- 참고 링크

c언어 memcpy vs memmove : 메모리를 바이트 단위로 복사한다 (tistory.com)

C언어 메모리 조작(memcpy, memmove) : 네이버 블로그 (naver.com)

 

 


 

 

위에서 배운 메모리 관련 함수들을 사용할 땐, 범위가 byte 단위임을 유의해야 합니다!!

 

 

 

 

반응형

'C,C++ > 정보정리' 카테고리의 다른 글

[C/C++] 가상함수  (0) 2022.09.30
[C/C++] 파일 입출력 함수 정리  (0) 2022.09.27
[C/C++] _getch() 함수  (0) 2022.09.23
[C/C++] enum, enum class 차이점  (0) 2022.09.20
[C/C++] cin 관련 함수, system 함수  (2) 2022.09.17

댓글