C++ 什么时候是c++;11允许记忆吗?
我的问题如下: 如果我想复制一个类类型,memcpy可以很快完成。这在某些情况下是允许的 我们有一些类型特征:C++ 什么时候是c++;11允许记忆吗?,c++,c++11,memory,C++,C++11,Memory,我的问题如下: 如果我想复制一个类类型,memcpy可以很快完成。这在某些情况下是允许的 我们有一些类型特征: 是标准的布局 是可以复制的 我想知道的是当一个类型是“按位可复制”时的确切要求 我的结论是,如果是三元可复制的和是标准的特征都为真,则类型是按位可复制的: 这正是我需要按位复制的内容 是不是训练过度了 它是欠约束的吗 附言:当然,memcpy的结果必须是正确的。我知道我可以在任何情况下记忆,但记忆不正确。我所理解的是 对象应具有默认构造函数/析构函数 默认的复制和移动操作 没有静
- 是标准的布局
- 是可以复制的
是三元可复制的
和是标准的
特征都为真,则类型是按位可复制的:
- 对象应具有默认构造函数/析构函数
- 默认的复制和移动操作
- 没有静态和虚拟函数具有多个
- 非静态数据成员的访问说明符可防止
- 布局优化有一个非静态成员或一个非静态的基 标准布局
参考文献:C++编程语言第四版可以使用<代码> MycPy < />代码复制一个T类对象,当
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++标准,一个类型为“可复制”的意思是:
组成对象的底层字节可以复制到数组中 指字符或无符号字符。如果将字符或无符号字符数组的内容复制回 对象,则该对象随后应保持其原始值 然而,重要的是要认识到指针也是可复制的类型。无论何时,只要要复制的数据结构中有指针,就必须在头脑中确保正确地复制它们 仅依赖可复制的对象可能导致危险的示例:- 一种树结构实现,其中数据放置在连续的内存区域中,但节点将绝对地址存储到子节点
- 为了提高多线程性能(以减少缓存崩溃),创建某些数据的多个实例,并在其中拥有指针,指向任意位置
- 您有一个没有指针的平面对象,但内部嵌入了第三方结构。在将来的某个时候,第三方结构包括一个不应该存在两次或更多次的指针
要意识到
是可复制的
用编译器的说法,只是的“语法检查”,而不是的“语义测试”。如果一个类型是可复制的,那么