Libft(5) - memmove

2021. 6. 26. 16:1442seoul/42 Cursus

Libft(5) - memmove

 

MEMMOVE(3)               BSD Library Functions Manual               MEMMOVE(3)

NAME
     memmove -- copy byte string

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <string.h>

     void *
     memmove(void *dst, const void *src, size_t len);

DESCRIPTION
     The memmove() function copies len bytes from string src to string dst.  The two
     strings may overlap; the copy is always done in a non-destructive manner.

RETURN VALUES
     The memmove() function returns the original value of dst.

SEE ALSO
     bcopy(3), memccpy(3), memcpy(3), strcpy(3), wmemmove(3)

STANDARDS
     The memmove() function conforms to ISO/IEC 9899:1990 (``ISO C90'').

BSD                              June 4, 1993                              BSD

 

  • src에서 dst로 len 바이트만큼 복사.
  • src와 dst 간 overlap도 가능.
  • 복사는 항상 비파괴방식!

기본 함수 구조 및 매개변수

     #include <string.h>

     void *
     memmove(void *dst, const void *src, size_t len);
  • dst: 복사될 메모리를 가리키는 포인터 (목적지)
  • src: 복사할 메모리를 가리키는 포인터 (출발지)
  • len: 복사할 바이트 길이

 

어차피 복사는 memcpy가 있는데 왜 memmove도 존재하는 걸까?

memcpy는 어디 거치지 않고 바로 붙여 넣는 것이고, memmove는 안전하게 복사할 것을 버퍼에 복사하고 버퍼에 복사된 것을 목적지에 붙여넣는 방식으로 구현됨.

성능적으로 따지면 memcpy가 버퍼를 거치지 않아 더 빠르겠지만 버퍼를 이용하는 memmove가 더 안정적!

 

위와 같은 이유로 안정적이라서 비파괴 방식인 non-destructive manner 가 man에 기재된 것으로 생각됨.

 

restrict 면에서 본 차이점을 이전에 기록해 둔 글.

https://byein.tistory.com/4

 

Libft(3) - memcpy

Libft(3) - memcpy MEMCPY(3) BSD Library Functions Manual MEMCPY(3) NAME memcpy -- copy memory area LIBRARY Standard C Library (libc, -lc) SYNOPSIS #include void * memcpy(void *restrict dst, const vo..

byein.tistory.com

 

함수를 구현하면서 tmp를 따로 만들었는데 이 tmp가 필요한 이유는 overlap을 지원하기 때문. 

 

1. restrict

2. 버퍼

 

위의 2가지 이유로 인한 차이가 존재하는 것으로 생각됨.

 

두 문자열 간 overlap 가능

src와 dst가 같은 문자열인 경우 overlap될 수도 있기 때문에 각 포인터가 어디를 가리키는지 위치가 중요!

  • src의 주소가 dst보다 큰 값이면, src의 처음부터 len만큼 dst에 복사하면 됨. src를 한 바이트씩 복사하더라도 dst보다 큰 위치에 있기 때문에 overlap 되더라도 src를 모두 정상적으로 dst에 복사 가능.
  • src의 주소가 dst보다 작은 값이면, src의 마지막 데이터부터 한 바이트씩 dst의 마지막 바이트부터 순서대로 복사함.

 

 

참고 자료

두 문자열 간 overlap 이해 위한 자료

https://hand-over.tistory.com/47

 

memmove 사용법 및 구현 - C 메모리 이동

사용법 #include void *memmove(void *dest, const void *src, size_t n); 정의 memmove() 함수는 src 메모리 영역에서 dest 메모리 영역으로 n byte 만큼 복사합니다. src 배열은 src와 dest 의 메모리 영역과 겹..

hand-over.tistory.com

https://blockdmask.tistory.com/444

 

[C언어/C++] memmove 메모리 이동 함수 설명 및 예시

안녕하세요. BlockDMask 입니다 오늘은 C, C++에서 메모리 이동을 하는 함수 memmove 라는 함수에 대해서 알아보려고 합니다. 지난시간과 지지난시간에는 메모리를 초기화 하는 memset 함수와 메모리를

blockdmask.tistory.com

 

'42seoul > 42 Cursus' 카테고리의 다른 글

Libft(7) - memcmp  (0) 2021.06.26
Libft(6) - memchr  (0) 2021.06.26
Libft(4) - memccpy  (0) 2021.05.22
Libft(3) - memcpy  (0) 2021.05.22
Libft(2) - bzero  (0) 2021.05.22