2021. 6. 26. 16:14ㆍ42seoul/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 면에서 본 차이점을 이전에 기록해 둔 글.
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 |