命名空间
变体
操作

std::memcpy

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

count 字节从 src 指向的对象复制到 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()
{
    // simple usage
    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";
 
    // reinterpreting
    double d = 0.1;
//  std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation
    std::int64_t n;
    std::memcpy(&n, &d, sizeof d); // OK
 
    std::cout << std::hexfloat << d << " is " << std::hex << n
              << " as a std::int64_t\n" << std::dec;
 
    // object creation in destination buffer
    struct S
    {
        int x{42};
        void print() const { std::cout << '{' << x << "}\n"; }
    } s;
    alignas(S) char buf[sizeof(S)];
    S* ps = new (buf) S; // placement new
    std::memcpy(ps, &s, sizeof s);
    ps->print();
}

输出

dest[4] = {'o', 'n', 'c', 'e'};
0x1.999999999999ap-4 is 3fb999999999999a as a std::int64_t
{42}

[编辑] 另请参阅

将一个缓冲区移动到另一个缓冲区
(函数) [编辑]
用一个字符填充缓冲区
(函数) [编辑]
在两个不重叠的数组之间复制一定数量的宽字符
(函数) [编辑]
复制字符
(std::basic_string<CharT,Traits,Allocator> 的公有成员函数) [编辑]
将一系列元素复制到新位置
(函数模板) [编辑]
以相反顺序复制一系列元素
(函数模板) [编辑]
检查类型是否可直接复制
(类模板) [编辑]
C 文档 for memcpy