Namespaces
Variants

std:: memmove

From 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 文档 for memmove