std::memcpy

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

按顺序进行以下操作:

  1. dest 隐式创建对象。
  2. src 所指向的对象复制 count 个(如同具有 unsigned char 类型的)字符到 dest 所指向的对象中。

如果满足以下任意条件,那么行为未定义:

目录

[编辑] 参数

dest - 指向复制目的对象的指针
src - 指向复制来源对象的指针
count - 复制的字节数

[编辑] 返回值

如果存在已适当创建的对象,那么返回指向该对象的指针;否则返回 dest

[编辑] 注解

std::memcpy 理应是最快的内存到内存复制的库例程。它通常比必须扫描其所复制数据的 std::strcpy,或必须预防以处理重叠输入的 std::memmove 更高效。

许多 C++ 编译器将适合的内存复制循环变换为 std::memcpy 调用。

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

[编辑] 示例

#include <cstdint>
#include <cstring>
#include <iostream>
 
int main()
{
    // 简单用法
    char source[] = "once upon a daydream...", dest[4];
    std::memcpy(dest, source, sizeof dest);
    std::cout << "dest[4] = {";
    for (int n{}; char c : dest)
        std::cout << (n++ ? ", " : "") << '\'' << c << "'";
    std::cout << "};\n";
 
    // 转译
    double d = 0.1;
//  std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // 别名违规
    std::int64_t n;
    std::memcpy(&n, &d, sizeof d); // OK
 
    std::cout << std::hexfloat << d << " 作为 std::int64_t 时是 "
              << std::hex << n << "\n" << std::dec;
 
    // 在目标缓冲区中创建对象
    struct S
    {
        int x{42};
        void print() const { std::cout << '{' << x << "}\n"; }
    } s;
    alignas(S) char buf[sizeof(S)];
    S* ps = new (buf) S; // 布置 new
    std::memcpy(ps, &s, sizeof s);
    ps->print();
}

输出:

dest[4] = {'o', 'n', 'c', 'e'};
0x1.999999999999ap-4 作为 std::int64_t 时是 3fb999999999999a 
{42}

[编辑] 缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
LWG 4064 C++98 不明确返回的指针是否指向已适当创建的对象 使之明确

[编辑] 参阅

移动一个缓冲区到另一个
(函数) [编辑]
以一个字符填充缓冲区
(函数) [编辑]
在两个不重叠数组间复制一定量宽字符
(函数) [编辑]
复制字符
(std::basic_string<CharT,Traits,Allocator> 的公开成员函数) [编辑]
复制范围中元素到新位置
(函数模板) [编辑]
从后往前复制范围中元素
(函数模板) [编辑]
检查类型是否可平凡复制
(类模板) [编辑]
memcpy 的 C 文档