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 为零。

若对象潜在重叠或非可平凡复制 (TriviallyCopyable) ,则 memmove 的行为未指定,且可能未定义

参数

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

返回值

dest

注解

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

尽管说明了“如同”使用临时缓冲区,此函数的实际实现不会带来二次复制或额外内存的开销。常用方法( glibc 和 bsd libc )是若目标在源之前开始,则从缓冲区开始正向复制,否则从末尾反向复制,完全无重叠时回落到更高效的 std::memcpy

严格别名使用禁止检验同一内存为二个不同类型的值处,可用 std::memmove 转换值。

示例

#include <iostream>
#include <cstring>
 
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

参阅

复制一个缓冲区到另一个
(函数)
以一个字符填充缓冲区
(函数)
在两个可能重叠的数组间复制一定量宽字符
(函数)
将某一范围的元素复制到一个新的位置
(函数模板)
按从后往前的顺序复制一个范围内的元素
(函数模板)
检查类型是否可平凡复制
(类模板)