C語言實現memcpy函數的使用示例
更新時間:2023年09月15日 14:57:06 作者:Dzhuser
在C語言中,我們可以自己實現 memcpy 函數來實現內存數據的拷貝操作,本文就來介紹一下C語言實現memcpy函數的使用示例,感興趣的可以了解一下
在 C 語言中,我們可以自己實現 memcpy 函數來實現內存數據的拷貝操作。memcpy 函數用于將指定長度的數據從源地址復制到目標地址。
按字節(jié)拷貝實現memcpy
#include <stdio.h>
void* my_memcpy_byte(void* dst, const void* src, int n)
{
if (dst == NULL || src == NULL || n <= 0)
return NULL;
char* pdst = (char*)dst;
char* psrc = (char*)src;
//判斷目標內存區(qū)域和源內存區(qū)域是否有重疊
if (pdst > psrc && pdst < psrc + n)
{
//如果有重疊,就從尾部開始遍歷
pdst = pdst + n - 1;
psrc = psrc + n - 1;
while (n--)
*pdst-- = *psrc--;
}
else
{
while (n--)
*pdst++ = *psrc++;
}
return dst;
}
int main(void)
{
char str[] = "HelloWorld";
char* str1 = &str[0];
char* str2 = &str[1];
my_memcpy_byte(str1, str2, 5);
printf("%s\n", str); //輸出elloWWorld
return 0;
}
按4字節(jié)拷貝實現memcpy
#include <stdio.h>
void* my_memcpy_byte(void* dst, const void* src, int n)
{
if (dst == NULL || src == NULL || n <= 0)
return NULL;
int* pdst = (int*)dst;
int* psrc = (int*)src;
char* pdstTemp = NULL;
char* psrcTemp = NULL;
int byte4Count = n / 4; //有多少個4字節(jié),按4字節(jié)拷貝
int byteCount = n % 4; //剩余字節(jié)數按字節(jié)拷貝
//判斷目標內存區(qū)域和源內存區(qū)域是否有重疊,如果有從后往前,如果沒有從前往后
if (pdst > psrc && pdst < (char*)psrc + n)
{
pdstTemp = (char*)pdst + n - 1;
psrcTemp = (char*)psrc + n - 1;
while (byteCount--)
{
*pdstTemp-- = *psrcTemp--;
}
pdstTemp++;
psrcTemp++;
pdst = (int*)pdstTemp;
psrc = (int*)psrcTemp;
pdst--;
psrc--;
while (byte4Count--)
{
*pdst-- = *psrc--;
}
}
else
{
while (byte4Count--)
{
*pdst++ = *psrc++;
}
pdstTemp = (char*)pdst;
psrcTemp = (char*)psrc;
while (byteCount--)
{
*pdstTemp++ = *psrcTemp++;
}
}
return dst;
}
int main(void)
{
char str[] = "HelloWorld";
char* str1 = &str[0];
char* str2 = &str[1];
my_memcpy_byte(str1, str2, 1);
printf("%s\n", str);
return 0;
}
Tips
對比字節(jié)拷貝,4字節(jié)拷貝速度是提高不少。
但是需要注意,void *dst, const void *src這兩個參數是需要按4字節(jié)對齊的,如果本身不是4字節(jié)對齊,按4字節(jié)拷貝效率也會變低。
到此這篇關于C語言實現memcpy函數的使用示例的文章就介紹到這了,更多相關C語言memcpy函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

