內存操作函數是 C 語言標準庫 `
| 函數 | 功能 | 重疊處理 | 返回值 | 典型用途 |
|---|---|---|---|---|
memcpy | 內存拷貝 | 未定義行為 (UB) | dest | 非重疊區域高速拷貝 |
memmove | 內存移動 | 安全處理 (內部用臨時緩衝或逆向拷貝) | dest | 可能重疊區域 (數組插入/刪除) |
memcmp | 內存比較 | 只讀,無重疍問題 | <0 / =0 / >0 | 二進制數據比較、排序 |
memchr | 查找字節 | 只讀 | 指針 / NULL | 原始緩衝區查找特定字節 |
memset | 內存設置 | 只寫 | dest | 清零結構體、初始化緩衝區 |
memccpy | 拷貝至指定字節 | UB (同 memcpy) | 下一字節指針 / NULL | 解析以特定字節結尾的協議數據 |
void *memcpy(void *dest, const void *src, size_t n); void *memmove(void *dest, const void *src, size_t n);
關鍵差異:
memcpy:假設 dest 與 src 不重疊,編譯器可優化為向量指令 (SSE/AVX/NEON),極快。重疊時行為未定義 (數據損壞、崩潰、看似正常)memmove:內部檢測重疊方向,選擇正向/逆向拷貝,保證語義正確,微小性能開銷決策規則: 不確定是否重疊 → 用 memmove;確定不重疊 → 用 memcpy。現代 libc 中 `memcpy` 內部常檢測重疍自動降級為 `memmove`,但標準不保證。
int memcmp(const void *s1, const void *s2, size_t n);
void *memchr(const void *s, int c, size_t n);
n 字節中查找字節 c (轉為 `unsigned char`)NULLvoid *memset(void *s, int c, size_t n);
n 字節設置為字節值 c (低 8 位有效)void *memccpy(void *dest, const void *src, int c, size_t n);
c (含該字節) 或完成 n 字節dest 中 c 後的下一字節指針;未遇到返回 NULLint memicmp(const void *s1, const void *s2, size_t n);
| 場景 | 錯誤做法 | 正確做法 |
|---|---|---|
| 結構體拷貝 | `memcpy(&dst, &src, sizeof(dst))` 可能重疊 | `memmove` 或直接賦值 `dst = src` |
| 結構體比較 | `memcmp(&a, &b, sizeof(a)) == 0` | 逐字段比較,或 `memset(&a, 0, sizeof(a))` 後再比 |
| 整數數組清零 | `memset(arr, 0, sizeof(arr))` ✓ | 正確 (全位 0 即整數 0) |
| 整數數組置 1 | `memset(arr, 1, sizeof(arr))` ✗ | 循環賦值 或 `std::fill` |
| 指針數組清零 | `memset(ptr_arr, 0, sizeof(ptr_arr))` ✓ | 正確 (全位 0 即空指針) |
| float/double 清零 | `memset(arr, 0, sizeof(arr))` ✓ | 正確 (IEEE 754 全位 0 即 0.0) |
| 重疊緩衝區移動 | `memcpy(buf+2, buf, 10)` ✗ | `memmove(buf+2, buf, 10)` ✓ |
| C 函數 | C++ 替代 | 優勢 |
|---|---|---|
| memcpy | `std::copy`, `std::copy_n` | 類型安全、支援迭代器、重疍安全 |
| memmove | `std::move` (算法), `std::copy_backward` | 同上 |
| memcmp | `std::equal`, `std::lexicographical_compare` | 泛型、可自定義比較 |
| memchr | `std::find` | 類型安全 |
| memset | `std::fill`, `std::fill_n` | 類型安全、非字節模式也可 |
內存操作函數族是「字節級編程」的基石。**`memmove` 安全通吃,`memcpy` 極速專用,`memcmp` 二進制比較,`memchr` 查找,`memset` 清零初始化**。理解「重疊語義」、「字節模式限制」、「無符號比較」三大核心概念,能寫出正確、高效、可移植的系統級代碼。C++ 專案優先使用 `