std::memcpy

< 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::strcpy ,或必须预防以处理重叠输入的 std::memmove 更高效。

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

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

示例

#include <iostream>
#include <cstdint>
#include <cstring>
 
int main()
{
    // 简单用法
    char source[] = "once upon a midnight dreary...", dest[4];
    std::memcpy(dest, source, sizeof dest);
    for (char c : dest)
        std::cout << c << '\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 << " is " << std::hex << n
              << " as an std::int64_t\n";
}

输出:

o
n
c
e
0x1.999999999999ap-4 is 3fb999999999999a as an std::int64_t

参阅

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