memcpy是最高效的内存块拷贝函数,它按字节原样搬运、无类型检查、由编译器底层优化(如SIMD或rep movsb),但要求源与目标内存不重叠,且第三个参数必须为精确字节数。

直接用 memcpy 就是最高效的方案。它不解析数据类型,只按字节原样搬运,由编译器底层优化(如 SIMD 指令或汇编级 rep movsb),比任何循环都快一个量级。
为什么 memcpy 是极速移位的核心
内存块“移位”本质是把一段连续内存的内容整体搬到另一段连续地址——这正是 memcpy 的设计目标:
- 操作单位是字节,不关心内容是 int 数组、结构体还是 raw buffer
- 无类型检查开销,无构造/析构调用,零语义负担
- 现代标准库实现会自动选择最优路径:小块走寄存器,大块启向量化,超大块分页对齐
- 只要源与目标内存不重叠,行为完全确定且安全
正确计算 size 参数是关键
第三个参数必须是字节数,不是元素个数。常见写法:
- int arr[100]; memcpy(dst, arr, sizeof(arr)); —— 推荐,数组名可得总大小
- memcpy(dst, src, n * sizeof(int)); —— 动态长度时用,n 是元素数量
- 错例:memcpy(dst, src, n); —— 只拷了 n 字节,不是 n 个 int
避免重叠导致数据错乱
如果目标地址在源地址区间内(比如数组内部前移/后移),不能用 memcpy:
- 例如:把 arr[5..9] 移到 arr[0..4],此时 src=arr+5,dest=arr,区域重叠
- 应改用 memmove,它自动检测方向,从前或从后拷贝,确保不覆盖未读数据
- memmove 性能略低但安全,重叠场景下没有替代方案
搭配 std::array 或指针偏移实现灵活移位
实际移位常需跳过首部或截取子段,可结合地址运算:
- 复制后 8 个元素:memcpy(dst, src + 2, 8 * sizeof(double));
- 用 std::array 更清晰:std::array
a = {…}; std::array (编译器通常优化为 memcpy)b; std::copy(a.begin() + 2, a.end(), b.begin()); - 若 dst 和 src 类型一致且对齐良好,还可强制 reinterpret_cast
提升泛用性

















