인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

송동규님의 프로필 이미지
송동규

작성한 질문수

독하게 시작하는 C 프로그래밍

memcpy 내부 구현은 어떻게 아신건가요?

해결된 질문

작성

·

21

0

선생님 안녕하세요!
자바에서 native 메서드 보다가 선생님 C 강좌까지 와버렸습니다.
메모리 복사 관련한 함수 중 memmove의 내부 동작 원리를 찾다가 강의에서 memcpy를 설명하시는걸 보았습니다. 이때 memcpy 내부 구현이 반복문으로 되어있다고 설명하셨는데 이런 내부 구현은 어떻게 아신건가요?
혹시 memmove도 반복문으로 구현이 되어있을까요?

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

좋은 세상입니다. 인프런 AI 답변을 참고하시기 바랍니다.

거기에 조금만 더 제 생각을 말씀드리면...
리눅스 같은 오픈소스 시스템을 보면 C 라이브러리 코드를 보는 것은 어렵지 않습니다. 이를 통해 반복문임을 알 수 있습니다. 그러나 이에 관해 더 생각해볼 문제는 "CPU 구조가 달라질 경우 메모리 복사에 관한 코드가 어떻게 최적화될 수 있는 것인가?" 입니다. 우리가 작성하는 프로그램들이 하는 일 중 메모리 복사는 빈번한 일입니다. 이에 대한 최적화는 시스템 전반의 성능과 직결됩니다.

CPU의 ESI, EDI 레지스터에 대해서 한 번 알아보시는 것을 권합니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다. 송동규님.

memcpymemmove 같은 표준 라이브러리 함수의 내부 구현 방식에 대해 궁금해 하시는군요. 이런 함수들의 구현 방법은 C 표준 라이브러리에 포함된 다양한 운영체제나 컴파일러에 따라 달라질 수 있습니다. 하지만 일반적으로 memcpymemmove는 효율적인 메모리 복사를 위해 반복문 또는 최적화를 위한 다른 형태의 루프를 사용할 가능성이 큽니다.

memcpy는 주로 단순한 메모리 복사 작업을 위해 설계되어 있으며, 소스와 대상 메모리 영역이 겹치지 않는다는 전제를 가지고 있어서 간단한 반복문이나 블록 복사 기법을 사용합니다. 반면에 memmove는 겹칠 수 있는 메모리 영역에 대해서도 안전하게 복사 작업을 수행할 수 있도록 되어 있어, 실제로는 메모리를 한쪽 끝에서 다른 끝으로 안전하게 이동시키는 방식으로 동작합니다.

내부 구현 방식을 알기 위해서는 해당 표준 라이브러리가 포함된 시스템의 소스 코드를 살펴보면 보다 정확하게 이해할 수 있습니다. 예를 들어, 리눅스 시스템에서는 GNU C 라이브러리(glibc)가 많이 사용되므로, 그 소스 코드를 통해 구현 방식을 확인할 수 있습니다. 또한, 오픈 소스인 경우 이 소스 코드를 분석하여 이러한 사항을 파악할 수 있습니다.

다음은 관련된 리소스를 제공하는 페이지로, 여러 라이브러리의 memcpy 구현 방식에 대해 자세히 다룬 자료들을 확인하실 수 있습니다.

  1. Stack Overflow - Why is memmove faster than memcpy?
  2. Linux man pages - memcpy

memmove 역시 특정 구현에서는 반복문이나, 복사하려는 데이터의 크기와 시스템의 아키텍처에 따라 최적화된 방법을 사용할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

송동규님의 프로필 이미지
송동규

작성한 질문수

질문하기