欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實(shí)現(xiàn)memcpy函數(shù)的使用示例

 更新時(shí)間:2023年09月15日 14:57:06   作者:Dzhuser  
在C語言中,我們可以自己實(shí)現(xiàn) memcpy 函數(shù)來實(shí)現(xiàn)內(nèi)存數(shù)據(jù)的拷貝操作,本文就來介紹一下C語言實(shí)現(xiàn)memcpy函數(shù)的使用示例,感興趣的可以了解一下

在 C 語言中,我們可以自己實(shí)現(xiàn) memcpy 函數(shù)來實(shí)現(xiàn)內(nèi)存數(shù)據(jù)的拷貝操作。memcpy 函數(shù)用于將指定長度的數(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ū)域是否有重疊,如果有從后往前,如果沒有從前往后
    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這兩個(gè)參數(shù)是需要按4字節(jié)對齊的,如果本身不是4字節(jié)對齊,按4字節(jié)拷貝效率也會(huì)變低。

 到此這篇關(guān)于C語言實(shí)現(xiàn)memcpy函數(shù)的使用示例的文章就介紹到這了,更多相關(guān)C語言memcpy函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++前綴和與差分的使用示例講解

    C++前綴和與差分的使用示例講解

    前綴和是指某序列的前n項(xiàng)和,可以把它理解為數(shù)學(xué)上的數(shù)列的前n項(xiàng)和,而差分可以看成前綴和的逆運(yùn)算。合理的使用前綴和與差分,可以將某些復(fù)雜的問題簡單化。類似于數(shù)學(xué)中的求導(dǎo)和積分,差分可以看成前綴和的逆運(yùn)算
    2023-03-03
  • C++ Qt QColorDialog使用方法

    C++ Qt QColorDialog使用方法

    本文主要介紹了C++ Qt QColorDialog使用方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Linux下C語言實(shí)現(xiàn)C/S模式編程

    Linux下C語言實(shí)現(xiàn)C/S模式編程

    這篇文章主要為大家詳細(xì)介紹了Linux下C語言實(shí)現(xiàn)C/S模式編程的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • C語言實(shí)現(xiàn)員工工資管理系統(tǒng)

    C語言實(shí)現(xiàn)員工工資管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)員工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語言編寫實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    C語言編寫實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言編寫實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++關(guān)于類結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測試詳解

    C++關(guān)于類結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測試詳解

    這篇文章主要介紹了C++類結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測試,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解C++中的isunordered函數(shù)

    詳解C++中的isunordered函數(shù)

    這篇文章主要介紹了C++中的isunordered函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • C++面試題之結(jié)構(gòu)體內(nèi)存對齊計(jì)算問題總結(jié)大全

    C++面試題之結(jié)構(gòu)體內(nèi)存對齊計(jì)算問題總結(jié)大全

    這篇文章主要給大家總結(jié)了關(guān)于C++面試題中結(jié)構(gòu)體內(nèi)存對齊計(jì)算問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),通過這些介紹的內(nèi)容對大家在面試C++工作的時(shí)候,會(huì)有一定的參考幫助,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • C語言在頭文件中定義const變量詳解

    C語言在頭文件中定義const變量詳解

    這篇文章主要介紹了C語言在頭文件中定義const變量詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • opencv3/C++ FLANN特征匹配方式

    opencv3/C++ FLANN特征匹配方式

    今天小編就為大家分享一篇opencv3/C++ FLANN特征匹配方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論