首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C標準庫 string.h 核心函數實現:memcmp、memcpy、memmove、memset

     編輯:關於C語言

memcmp:記憶體區塊比較

int memcmp(const void *buf1, const void *buf2, size_t count) {
    const unsigned char *p1 = buf1, *p2 = buf2;
    while (count--) {
        if (*p1 != *p2) return *p1 - *p2;
        p1++; p2++;
    }
    return 0;
}

關鍵:用 unsigned char 逐位元組比較,確保正負號正確。

memcpy:記憶體複製(不處理重疊)

void *memcpy(void *dest, const void *src, size_t count) {
    void *ret = dest;
    unsigned char *d = dest;
    const unsigned char *s = src;
    while (count--) *d++ = *s++;
    return ret;
}

假設 src 與 dest 不重疊,單向複製即可。

memmove:安全複製(處理重疊)

void *memmove(void *dest, const void *src, size_t count) {
    void *ret = dest;
    unsigned char *d = dest;
    const unsigned char *s = src;
    
    if (d < s) {
        // 低位址→高位址:正向複製
        while (count--) *d++ = *s++;
    } else if (d > s) {
        // 重疊且 dest 在 src 後:逆向複製避免覆蓋
        d += count; s += count;
        while (count--) *--d = *--s;
    }
    return ret;
}

核心差異:memmove 檢測重疊並選擇複製方向,memcpy 不檢查,重疊時行為未定義。

memset:記憶體填充

void *memset(void *ptr, int value, size_t count) {
    void *ret = ptr;
    unsigned char *p = ptr;
    unsigned char v = (unsigned char)value;
    while (count--) *p++ = v;
    return ret;
}

將 value 低 8 位填入每個位元組,常用於結構體/陣列歸零。

MSVC 實現參考

  • 優先使用內建函數(RtlMoveMemory、RtlFillMemory)
  • 針對特定架構(ARM、Alpha、PPC)有組合語言優化版本
  • 通用 C 實現作為回退

效能優化方向

  1. 字對齊存取:以 size_t/uint64_t 為單位批量複製
  2. SIMD 指令集(SSE/AVX/NEON)向量化
  3. 預取指令減少快取遺失
  4. 小區塊用逐位元組,大區塊用向量化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved