Namespaces
Variants

std:: memmove

From zh.cppreference.net
定义于头文件 <cstring>
void * memmove ( void * dest, const void * src, std:: size_t count ) ;

按顺序执行以下操作:

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

如果 dest 或 src 是 空指针 或 无效指针 ,则行为未定义。

目录

参数

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

返回值

如果存在一个 已创建的合适对象 ,则返回指向它的指针;否则返回 dest 。

注释

尽管规范说明会使用临时缓冲区,但该函数的实际实现不会产生双重拷贝或额外内存的开销。对于较小的 count ,可能直接加载和写入寄存器;对于较大的数据块,常见实现方案(glibc和bsd libc)是:若目标起始位置在源之前,则从缓冲区起始处向前拷贝字节;反之则从末尾向后拷贝;当完全不存在重叠时,会回退到 std::memcpy 。

当 严格别名规则 禁止以两种不同类型值的形式检查同一内存区域时,可使用 std::memmove 进行值类型转换。

示例

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

输出:

1234567890
1234456890

缺陷报告

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

缺陷报告 适用范围 发布时行为 正确行为
LWG 4064 C++98 未明确返回的指针是否指向适当创建的对象 已明确说明

参阅

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