std:: memcpy
      From cppreference.net
     
     
     | 
           定义于头文件
            
            
             <cstring>
            
            | ||
| 
           
            
             void
            
            
             *
            
            memcpy
            
             (
            
            
             void
            
            
             *
            
            dest,
            
             const
            
            
             void
            
            
             *
            
            src,
            
             
              std::
              
               size_t
              
             
            
            count
            
             )
            
            
             ;
            
           
           | ||
按顺序执行以下操作:
- 隐式创建 位于 dest 的对象。
- 从 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++11)
             
            
           
           | 复制元素范围到新位置 (函数模板) | 
| 按逆序复制元素范围 (函数模板) | |
| 
           
            
             
              (C++11)
             
            
           
           | 检查类型是否可平凡复制 (类模板) | 
| 
          
           
            C 文档
           
          
          for
          
           
            memcpy
           
          
          | |