C語(yǔ)言實(shí)現(xiàn)memcpy函數(shù)的使用示例
在 C 語(yǔ)言中,我們可以自己實(shí)現(xiàn) memcpy 函數(shù)來(lái)實(shí)現(xiàn)內(nèi)存數(shù)據(jù)的拷貝操作。memcpy 函數(shù)用于將指定長(zhǎng)度的數(shù)據(jù)從源地址復(fù)制到目標(biāo)地址。
按字節(jié)拷貝實(shí)現(xiàn)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;
//判斷目標(biāo)內(nèi)存區(qū)域和源內(nèi)存區(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é)拷貝實(shí)現(xiàn)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; //有多少個(gè)4字節(jié),按4字節(jié)拷貝
int byteCount = n % 4; //剩余字節(jié)數(shù)按字節(jié)拷貝
//判斷目標(biāo)內(nèi)存區(qū)域和源內(nèi)存區(qū)域是否有重疊,如果有從后往前,如果沒(méi)有從前往后
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
對(duì)比字節(jié)拷貝,4字節(jié)拷貝速度是提高不少。
但是需要注意,void *dst, const void *src這兩個(gè)參數(shù)是需要按4字節(jié)對(duì)齊的,如果本身不是4字節(jié)對(duì)齊,按4字節(jié)拷貝效率也會(huì)變低。
到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)memcpy函數(shù)的使用示例的文章就介紹到這了,更多相關(guān)C語(yǔ)言memcpy函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言之整數(shù)與浮點(diǎn)數(shù)運(yùn)算的類型轉(zhuǎn)換規(guī)則詳解
這篇文章主要介紹了C語(yǔ)言之整數(shù)與浮點(diǎn)數(shù)運(yùn)算的類型轉(zhuǎn)換規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
C++集體數(shù)據(jù)交換實(shí)現(xiàn)示例講解
這篇文章主要介紹了C++集體數(shù)據(jù)交換實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-11-11
C語(yǔ)言運(yùn)算符的優(yōu)先級(jí)與結(jié)合性詳解及一些錯(cuò)誤講解
C語(yǔ)言的運(yùn)算符和類型轉(zhuǎn)換是編程的基礎(chǔ),掌握其規(guī)則不僅能避免語(yǔ)法錯(cuò)誤,更能寫出高效、可靠的代碼,這篇文章主要介紹了C語(yǔ)言運(yùn)算符優(yōu)先級(jí)與結(jié)合性的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-03-03
C++編程產(chǎn)生指定范圍內(nèi)的隨機(jī)數(shù)
這篇文章主要為大家詳細(xì)介紹了C++編程產(chǎn)生指定范圍內(nèi)的隨機(jī)數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
快速了解C語(yǔ)言靜態(tài)關(guān)鍵字static的作用
這篇文章主要介紹了C語(yǔ)言中靜態(tài)關(guān)鍵字static的作用,對(duì)大家學(xué)習(xí)C語(yǔ)言非常有幫助,有需求的小伙伴可以參考下2020-05-05
深入解析C++中的構(gòu)造函數(shù)和析構(gòu)函數(shù)
析構(gòu)函數(shù):在撤銷對(duì)象占用的內(nèi)存之前,進(jìn)行一些操作的函數(shù)。析構(gòu)函數(shù)不能被重載,只能有一個(gè)2013-09-09
源碼分析C++是如何實(shí)現(xiàn)string的
我們平時(shí)使用C++開發(fā)過(guò)程中或多或少都會(huì)使用std::string,但您了解string具體是如何實(shí)現(xiàn)的嗎,本文小編就帶大家從源碼角度分析一下2023-04-04

