std::memmove

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

按顺序进行以下操作:

  1. dest 隐式创建对象。
  2. src 所指向的对象复制 count 个(如同具有 unsigned char 类型的,下同)字符到包含 count 个字符的数组 arr 中,其中 arr 不与 destsrc 分别指向的两个对象重合。
  3. arr 复制 count 个字符到 dest 所指向的对象中。

如果 destsrc空指针无效指针,那么行为未定义。

目录

[编辑] 参数

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 不明确返回的指针是否指向已适当创建的对象 使之明确

[编辑] 参阅

复制一个缓冲区到另一个
(函数) [编辑]
以一个字符填充缓冲区
(函数) [编辑]
在两个可能重叠的数组间复制一定量宽字符
(函数) [编辑]
复制范围中元素到新位置
(函数模板) [编辑]
从后往前复制范围中元素
(函数模板) [编辑]
检查类型是否可平凡复制
(类模板) [编辑]
memmove 的 C 文档