std::memmove
来自 cppreference.cn
| 在头文件 <cstring> 中定义 |
||
| void* memmove( void* dest, const void* src, std::size_t count ); |
||
按顺序执行以下操作
- 隐式地在 dest 创建对象。
- 将 count 个字符(如同 unsigned char 类型,下同)从 src 所指向的对象复制到一个临时数组 arr 中,该数组有 count 个字符,其中 arr 不与 dest 和 src 所指向的对象重叠。
- 将 count 个字符从 arr 复制到 dest 所指向的对象中。
若 dest 或 src 为 空指针或非法指针,则行为未定义。
目录 |
[编辑] 参数
| dest | - | 指向要复制到的内存位置的指针 |
| src | - | 指向要复制来源的内存位置的指针 |
| count | - | 要复制的字节数 |
[编辑] 返回值
若存在合适的已创建对象,则返回指向它的指针;否则返回 dest。
[编辑] 注意
尽管规范声称使用临时缓冲区,但此函数的实际实现不会带来双重复制或额外内存的开销。对于较小的 count,它可能会加载并写入寄存器;对于较大的块,常见方法(glibc 和 bsd libc)是,如果目标在源之前开始,则从缓冲区开头向前复制字节,否则从末尾向后复制,在完全没有重叠时回退到 std::memcpy。
在严格别名禁止将同一内存作为两种不同类型的值进行检查时,`std::memmove` 可用于转换值。
[编辑] 示例
运行此代码
输出
1234567890 1234456890
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
|---|---|---|---|
| LWG 4064 | C++98 | 尚不清楚返回的指针是否指向合适的已创建对象 | 已明确 |
[编辑] 参阅
| 将一个缓冲区复制到另一个缓冲区 (函数) | |
| 用字符填充缓冲区 (函数) | |
| 在两个可能重叠的数组之间复制一定数量的宽字符 (函数) | |
| (C++11) |
将一个范围的元素复制到一个新位置 (函数模板) |
| 以逆序复制一个范围的元素 (函数模板) | |
| (C++11) |
检查类型是否为可平凡复制类型 (类模板) |
| C 文档 for memmove
| |