memcpy是C標準庫中最高頻調用的函數之一,其優化程度直接影響系統整體性能。本文從朴素字節拷貝出發,逐步演進至字對齊優化、重疊處理、現代SIMD向量化,揭示高性能內存拷貝的核心技術棧。
void *safe_memcpy(void *dst, const void *src, size_t n) {
if (!dst || !src) return NULL;
char *d = (char*)dst;
const char *s = (const char*)src;
// 檢查重疊:dst在src區間內且dst > src → 需逆向拷貝
if (d > s && d < s + n) {
d += n; s += n;
while (n--) *--d = *--s; // 從尾部向前拷貝
} else {
while (n--) *d++ = *s++; // 正向拷貝
}
return dst;
}
注意:標準memcpy行為未定義於重疊區域,重疊安全版實際是memmove語義
// 編譯器內建函數,自動選擇最優實現
void *builtin_memcpy(void *dst, const void *src, size_t n) {
return __builtin_memcpy(dst, src, n);
}
// 針對固定大小結構體
struct Data { int a[100]; };
void copy_struct(struct Data *dst, struct Data *src) {
*dst = *src; // 編譯器優化為最優memcpy
}
典型輸出(x86_64, -O3):
naive_memcpy : 1245321 us, 0.81 GB/s safe_memcpy : 1251032 us, 0.81 GB/s word_memcpy : 156789 us, 6.42 GB/s stdlib memcpy : 45678 us, 22.04 GB/s builtin_memcpy : 45678 us, 22.04 GB/s關鍵優化技術總結
| 技術 | 原理 | 收益 | 適用場景 |
|---|---|---|---|
| 字對齊 | 按CPU字長批量搬運 | 4-8× | 所有平台 |
| SIMD向量化 | SSE/AVX/AVX-512寬指令 | 4-32× | x86_64/ARM NEON |
| 非時序存儲 | 繞過緩存直寫內存 | 大塊>10% | 大數組拷貝 |
| 預取 | 隱藏內存延遲 | 5-15% | 流式訪問 |
| rep movsb | 微碼優化字符串指令 | 中小塊最優 | Intel ERMSB CPU |
memcpy重疊行為未定義,需用memmovechar*可別名任何類型,但int*轉換拷貝違反strict aliasingmemcpy/memmove/memset*dst = *src編譯器最優優化-O2 -O3 -march=native讓編譯器自動向量化perf record -g定位熱點再優化memcpy優化是計算機體系結構、編譯器技術、標準庫實現綜合博弈的縮影。理解其演進脈絡,不僅能寫出高性能代碼,更能培養「相信編譯器、信任標準庫、Profile指導優化」的工程直覺。