1. memcpy 기능 도입 및 구현
memcpy 함수는 원본 위치에서 대상 메모리 위치로 num 바이트의 데이터를 거꾸로 복사합니다. 함수는 '\0'을 만나도 멈추지 않습니다. 소스와 대상이 겹치는 경우 복사 결과가 정의되지 않습니다.
void * memcpy ( void * destination, const void * source, size_t num );
사실 memcpy를 구현하는 방법은 매우 간단하다 어떤 데이터 타입을 건네주든 일률적으로 char*로 변환해준다 char 데이터 타입이 1바이트를 차지한다는 것을 알고 있다. 바이트 단위로 복사하는 데이터 유형이 무엇이든 상관 없습니다. 코드는 다음과 같이 구현됩니다.
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;//逐个字节++
src = (char*)src + 1;//逐个字节++
}
return ret;
}
2. memmove 기능 도입 및 구현
memcpy와의 차이점은 memmove 함수에 의해 처리되는 소스 메모리 블록과 대상 메모리 블록이 겹칠 수 있다는 것입니다. 원본 공간과 대상 공간이 겹치는 경우 memmove 함수를 사용하여 처리해야 합니다.
void * memmove ( void* destination, const void * source, size_t num );
여기에서는 두 가지 경우에 대상 > 소스 및 대상 < 소스에 대해 설명합니다. 먼저 코드 구현을 살펴보겠습니다.
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
if (dest < src)
{
//前->后
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//后->前
while (num--)//20
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
dest<src가 memcpy 구현 코드와 동일한 경우 여기에서 앞에서 뒤로 복사해도 겹치는 부분의 값이 변경되지 않기 때문입니다.
위는 memcpy 및 memmove의 전체 구현 프로세스 및 아이디어입니다. 시청해 주셔서 감사합니다.