命名空间
变体
操作

std::memmove

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

按顺序执行以下操作

  1. 隐式地在 dest 创建对象。
  2. count 个字符(如同 unsigned char 类型,下同)从 src 所指向的对象复制到一个临时数组 arr 中,该数组有 count 个字符,其中 arr 不与 destsrc 所指向的对象重叠。
  3. count 个字符从 arr 复制到 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); // copies from [4, 5, 6] to [5, 6, 7]
    std::cout << str << '\n';
}

输出

1234567890
1234456890

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 4064 C++98 尚不清楚返回的指针是否指向合适的已创建对象 已明确

[编辑] 参阅

将一个缓冲区复制到另一个缓冲区
(函数) [编辑]
用字符填充缓冲区
(函数) [编辑]
在两个可能重叠的数组之间复制一定数量的宽字符
(函数) [编辑]
将一个范围的元素复制到一个新位置
(函数模板) [编辑]
以逆序复制一个范围的元素
(函数模板) [编辑]
检查类型是否为可平凡复制类型
(类模板) [编辑]
C 文档 for memmove
English Deutsch 日本語 中文(简体) 中文(繁體)