C++ 什么时候是c++;11允许记忆吗?

C++ 什么时候是c++;11允许记忆吗?,c++,c++11,memory,C++,C++11,Memory,我的问题如下: 如果我想复制一个类类型,memcpy可以很快完成。这在某些情况下是允许的 我们有一些类型特征: 是标准的布局 是可以复制的 我想知道的是当一个类型是“按位可复制”时的确切要求 我的结论是,如果是三元可复制的和是标准的特征都为真,则类型是按位可复制的: 这正是我需要按位复制的内容 是不是训练过度了 它是欠约束的吗 附言:当然,memcpy的结果必须是正确的。我知道我可以在任何情况下记忆,但记忆不正确。我所理解的是 对象应具有默认构造函数/析构函数 默认的复制和移动操作 没有静

我的问题如下:

如果我想复制一个类类型,memcpy可以很快完成。这在某些情况下是允许的

我们有一些类型特征:

  • 是标准的布局
  • 是可以复制的
我想知道的是当一个类型是“按位可复制”时的确切要求

我的结论是,如果
是三元可复制的
是标准的
特征都为真,则类型是按位可复制的:

  • 这正是我需要按位复制的内容
  • 是不是训练过度了
  • 它是欠约束的吗
  • 附言:当然,memcpy的结果必须是正确的。我知道我可以在任何情况下记忆,但记忆不正确。

    我所理解的是

    • 对象应具有默认构造函数/析构函数
    • 默认的复制和移动操作
    • 没有静态和虚拟函数具有多个
    • 非静态数据成员的访问说明符可防止
    • 布局优化有一个非静态成员或一个非静态的基 标准布局
    您可以使用标准函数is_pod::value测试给定类型是否为pod(普通旧数据)


    参考文献:C++编程语言第四版

    可以使用<代码> MycPy < />代码复制一个T类对象,当 iStVivialyCopabel::Value是真的。该类型不需要是标准布局类型。“平凡可复制”的定义本质上是这样做是安全的

    使用
    memcpy
    可以安全复制但不是标准布局的类的示例:

    struct T {
      int i;
    private:
      int j;
    };
    
    因为该类对不同的非静态数据成员使用不同的访问控制,所以它不是标准布局,但它仍然是可复制的。

    来自:

    简单可复制类型的对象是C++中唯一可以安全地复制的代码:>代码> STD::MMECPY 或序列化到二进制文件中,使用<代码> STD:::OFFROW:::WrdIO(/St::IFFSUCT::Read)(<)/>代码>。一般来说,普通可复制类型是任何类型,对于该类型,基础字节可以复制到char或unsigned char数组中,并复制到相同类型的新对象中,并且生成的对象将具有与原始对象相同的值


    具有普通复制构造函数、普通复制赋值运算符和 可以使用
    memcpy
    memmove

    T
    的特殊成员函数的要求是微不足道的

    复制构造函数(cc)和复制赋值运算符(ca)
    • 不是用户提供的(意思是,它是隐式定义的或默认的),如果它是默认的,它的签名与隐式定义的相同
    • T
      没有虚拟成员功能
    • T
      没有虚拟基类
    • T
      的每个直接基选择的cc/ca是平凡的
    • T
      的每个非静态类类型(或类类型数组)成员选择的cc/ca是平凡的
    • T
      没有volatile限定类型的非静态数据成员(从C++14开始)
    析构函数
    • 不是用户提供的(意思是,它是隐式定义的或默认的)
    • 不是虚拟的(即基类析构函数不是虚拟的)
    • 所有直接基类都有平凡的析构函数
    • 类类型的所有非静态数据成员(或类类型的数组)都有平凡的析构函数
    仅将函数声明为
    =default
    并不会使它变得微不足道(只有在 该类还支持对应函数的所有其他条件(不重要) 但是在用户代码中显式地编写函数确实可以防止它变得微不足道。另外,所有与C语言兼容的数据类型(POD类型)都是可复制的


    源代码:C++中的C++并发操作和CPAuxEng.

    < P> >代码> ISTIVALYLYOBActudi::值< /C> >(或C++ 14代码),ISTrvivialAsAbAbAbl()/代码>,或C++ 17代码> ISSITVILYALYASPAB(V/<代码>)不是零,类型可使用<代码> MyCPY

    按C++标准,一个类型为“可复制”的意思是:

    组成对象的底层字节可以复制到数组中 指字符或无符号字符。如果将字符或无符号字符数组的内容复制回 对象,则该对象随后应保持其原始值

    然而,重要的是要认识到指针也是可复制的类型。无论何时,只要要复制的数据结构中有指针,就必须在头脑中确保正确地复制它们

    仅依赖可复制的对象可能导致危险的示例:

    • 一种树结构实现,其中数据放置在连续的内存区域中,但节点将绝对地址存储到子节点
    • 为了提高多线程性能(以减少缓存崩溃),创建某些数据的多个实例,并在其中拥有指针,指向任意位置
    • 您有一个没有指针的平面对象,但内部嵌入了第三方结构。在将来的某个时候,第三方结构包括一个不应该存在两次或更多次的指针
    因此,每当memcopying时,请记住检查指针是否可以在特定情况下被复制,以及这是否可以


    要意识到
    是可复制的
    用编译器的说法,只是的“语法检查”,而不是的“语义测试”

    如果一个类型是可复制的,那么