Namespaces
Variants

std:: memcpy

From cppreference.net
定义于头文件 <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); // 正确
    std::cout << std::hexfloat << d << " is " << std::hex << n
              << " as a std::int64_t\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 is 3fb999999999999a as a std::int64_t
{42}

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

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

参见

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