Libft(3) - memcpy

2021. 5. 22. 20:2942seoul/42 Cursus

Libft(3) - memcpy

MEMCPY(3)                BSD Library Functions Manual                MEMCPY(3)

NAME
     memcpy -- copy memory area

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <string.h>

     void *
     memcpy(void *restrict dst, const void *restrict src, size_t n);

DESCRIPTION
     The memcpy() function copies n bytes from memory area src to memory area dst.  If dst
     and src overlap, behavior is undefined.  Applications in which dst and src might
     overlap should use memmove(3) instead.

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

SEE ALSO
     bcopy(3), memccpy(3), memmove(3), strcpy(3), wmemcpy(3)

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

BSD                              June 4, 1993                              BSD

 

  • src 메모리에서 dst 메모리로 n 개의 바이트를 복사.
  • dst와 src가 overlap 되는 건 정의되지 않음.
  • dst, src의 overlap은 memmove 사용 권장.

 

기본 함수 구조 및 매개변수

     #include <string.h>

     void *
     memcpy(void *restrict dst, const void *restrict src, size_t n);
  • dst : 복사 받은 매모리를 가리키는 포인터
  • src : 복사할 메모리를 가리키는 포인터
  • n : 복사할 데이터의 바이트 수

 

  • 리턴값 : dst

restrict 포인터

  • *restrict : restrict 포인터
  • 컴파일러 속도 향상을 위해서 최적화에 도움을 줌.
  • restrict 포인터는 각 포인터가 서로 다른 메모리 공간을 가리키고 있고 다른 곳에서 접근하지 않기 때문에 컴파일러가 최적화를 하라는 의미.
  • 같은 공간을 가리키는 포인터에 restrict를 붙이면 최적화 때문에 결과가 잘못 나올 수 있으니 메모리 공간을 확인하고 다른 공간을 가리킬 때만 restrict 사용해야 함. 

 

memcpy vs memmove  (restrict로 인한 차이)

memcpy는 restrict가 붙어있고 memmove는 restrict가 없습니다. 여기서 memmove는 내부적으로 같은 메모리 공간을 가리키는지, 메모리가 겹치는지 모두 확인을 하기 때문에 성능이 떨어집니다. 만약 두 메모리 공간이 다른 공간을 가리키고 겹치지 않는다면 최적화된 memcpy를 사용하여 성능을 향상시킬 수 있습니다.

 

주의할 점

  • 길이를 계산할 때 char* 타입의 C언어 문자열 형태의 문자열의 전체를 복사할 때는 문자열의 끝을 알리는 "\0"의 길이도 계산해서 넣어야하기 때문에 '길이 +1'을 해줘야 함.
  • restrict로 되어 있어 source, dest 메모리 블록이 서로 겹쳐진 곳에서는 사용하지 못 함. 동일한 메모리 공간에 덮어씌워야 하는 경우 memmove() 함수 사용 권고.

 

참고 자료

https://blockdmask.tistory.com/442

 

[C언어/C++] memcpy 메모리 복사 함수 설명 및 예시

안녕하세요. BlockDMask 입니다. 오늘은 C언어, C++에서 메모리를 복사하는 함수 memcpy 함수에 대해서 한번 알아보려 합니다. 지난시간에는 메모리를 초기화 하는 memset에 대해서 배웠던거 기억하시

blockdmask.tistory.com

https://dojang.io/mod/page/view.php?id=760 

 

C 언어 코딩 도장: 85.16 restrict 포인터

restrict 포인터는 메모리 접근에 관련된 최적화 기능입니다(C99 표준). 예를 들어 다음과 같이 포인터를 역참조하여 값을 증가시키는 코드가 있습니다. increase.c void increase(int *a, int *b, int *x) { *a += *

dojang.io

 

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

Libft(6) - memchr  (0) 2021.06.26
Libft(5) - memmove  (0) 2021.06.26
Libft(4) - memccpy  (0) 2021.05.22
Libft(2) - bzero  (0) 2021.05.22
Libft(1) - memset  (0) 2021.05.22