std::memcpy

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

src 所指向的对象复制 count 个字符到 dest 所指向的对象。两个对象都被转译成 unsigned char 的数组。

若对象重叠,则行为未定义。

destsrc无效或空指针则行为未定义,纵使 count 为零。

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

参数

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

返回值

dest

注解

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

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}

参阅

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