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

手寫 memcpy 實現:按長整型塊拷貝優化

     編輯:關於C++

實現代碼


void* my_memcpy(void* dst, const void* src, int size) {
    const int word_size = sizeof(long);
    long* pdst = static_cast<long*>(dst);
    const long* psrc = static_cast<const long*>(src);

    // 按長整型塊拷貝
    for (; size >= word_size; ++pdst, ++psrc, size -= word_size) {
        *pdst = *psrc;
    }

    // 剩餘字節逐個拷貝
    char* c_dst = reinterpret_cast<char*>(pdst);
    const char* c_src = reinterpret_cast<const char*>(psrc);
    for (int i = 0; i < size; ++i) {
        c_dst[i] = c_src[i];
    }

    return dst;
}

int main() {
    char src[] = "hello";
    char dst[10] = {0};
    my_memcpy(dst, src, 5);
    printf("dst = %s\n", dst);
    return 0;
}

設計思路

  1. 字對齊拷貝**:用 sizeof(long) (通常 4/8 字節) 作為基本單位,減少循環次數,利用 CPU 塊傳輸指令
  2. 尾部處理**:剩餘不足一字長的字節退化為逐字節拷貝
  3. 指針運算**:先按 long* 遞增,再轉 char* 處理尾部

局限與改進方向

問題影響改進
**源/目標重疊未處理**行為未定義(標準 memcpy 保證正確)檢測重疊,反向拷貝或用 memmove 邏輯
**未對齊訪問風險**某些架構 (SPARC, ARM 舊版) 觸發 SIGBUS檢查地址對齊,未對齊時退化字節拷貝
**無向量化/SIMD**現代 CPU (SSE/AVX/NEON) 可 16/32/64 字節並行內建函數 __builtin_memcpy 或汇編優化
**size 為 int 可能溢出**64 位系統大內存拷貝截斷改用 size_t
**const 正確性**src 應為 const void*已修正

生產級建議

  1. **直接用標準庫 std::memcpy / std::copy**
  2. 編譯器內建函數會自動選擇最優策略(對齊、SIMD、非時序存儲等)
  3. 手寫僅適合:教學、嵌入式無標準庫、特殊硬件需求

性能對比參考 (x86-64, 1MB 數據)


std::memcpy (glibc)     : 1.0x  (基準)
my_memcpy (O2)          : 1.8x
my_memcpy + SIMD (手寫) : 0.9x  (需針對架構優化)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved