命名空间
变体
操作

std::memmove

来自 cppreference.cn
< cpp‎ | string‎ | byte
定义于头文件 <cstring>
void* memmove( void* dest, const void* src, std::size_t count );

按顺序执行以下操作

  1. 隐式创建位于 dest 的对象。
  2. src 指向的对象复制 count 个字符(如同类型为 unsigned char,下同)到一个临时数组 arr 中,该数组包含 count 个字符,其中 arr 不与 destsrc 指向的对象重叠。
  3. arr 复制 count 个字符到 dest 指向的对象。

如果 destsrc 是一个 空指针无效指针,则行为未定义。

目录

[edit] 参数

dest - 指向要复制到的内存位置的指针
src - 指向要复制来源的内存位置的指针
count - 要复制的字节数

[edit] 返回值

如果存在适当创建的对象,则返回指向它的指针;否则返回 dest

[edit] 注解

尽管规范说明使用了临时缓冲区,但此函数的实际实现不会产生双重复制或额外内存的开销。对于小的 count,它可能会加载和写出寄存器;对于较大的块,常见的做法(glibc 和 bsd libc)是,如果目标在源之前开始,则从缓冲区的前面向前复制字节,否则从末尾向后复制字节,并且在完全没有重叠时回退到 std::memcpy

严格别名 禁止将同一内存作为两种不同类型的值进行检查时,可以使用 std::memmove 来转换值。

[edit] 示例

#include <cstring>
#include <iostream>
 
int main()
{
    char str[] = "1234567890";
    std::cout << str << '\n';
    std::memmove(str + 4, str + 3, 3); // copies from [4, 5, 6] to [5, 6, 7]
    std::cout << str << '\n';
}

输出

1234567890
1234456890

[edit] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
LWG 4064 C++98 返回的指针是否指向适当创建的对象尚不清楚 已明确

[edit] 参见

将一个缓冲区复制到另一个缓冲区
(函数) [edit]
用字符填充缓冲区
(函数) [edit]
在两个可能重叠的数组之间复制一定数量的宽字符
(函数) [edit]
将元素范围复制到新位置
(函数模板) [edit]
以向后顺序复制元素范围
(函数模板) [edit]
检查类型是否为可平凡复制的
(类模板) [edit]
C 文档 关于 memmove