命名空间
变体
操作

std::memmove

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

src 指向的对象复制 count 个字符到 dest 指向的对象。这两个对象都被重新解释为 unsigned char 的数组。

这些对象可以重叠:复制操作就像将字符复制到一个临时字符数组,然后将字符从数组复制到 dest 一样。

如果 destsrc 是一个 无效或空指针,即使 count 为零,行为也是未定义的。

如果这些对象 可能重叠或不是 TriviallyCopyablememmove 的行为未指定,并且 可能未定义

内容

[编辑] 参数

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

[编辑] 返回值

dest

[编辑] 备注

std::memmove 可用于在目标缓冲区中 隐式创建 对象。

尽管指定为“就像”使用临时缓冲区一样,但该函数的实际实现不会产生双重复制或额外内存的开销。对于较小的 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); // copies from [4, 5, 6] to [5, 6, 7]
    std::cout << str << '\n';
}

输出

1234567890
1234456890

[编辑] 参见

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