我的问题如下:
如果我想复制类类型,memcpy可以非常快速地完成.在某些情况下允许这样做.
我们有一些类型特征:
我想知道的是当类型是"可按位复制"时的确切要求.
我的结论是,如果两个is_trivally_copyable和is_standard_layout特征都为真,则类型是按位可复制的:
PS:当然,memcpy的结果必须正确.我知道我可以在任何情况下记忆,但不正确.
bam*_*s53 19
如果memcpy为true ,则可以使用memcpy复制类型为T的对象.该类型不特别需要是标准布局类型."平凡可复制"的定义基本上是这样做的安全.
使用memcpy进行复制但不是标准布局的类的示例:
struct T {
int i;
private:
int j;
};
Run Code Online (Sandbox Code Playgroud)
因为此类对不同的非静态数据成员使用不同的访问控制,所以它不是标准布局,但它仍然可以轻易地复制.
如果is_trivally_copyable<T>::value(或在C++ 14中is_trivially_copyable<T>())不为零,则类型可以使用复制memcpy.
根据C++标准,可轻松复制的类型意味着:
构成对象的底层字节可以复制到char或unsigned char数组中.如果将char或unsigned char数组的内容复制回对象,则该对象应随后保持其原始值.
但是,重要的是要意识到指针也是简单的可复制类型.每当你要复制的数据结构中有指针时,你必须在脑力上确保复制它们是正确的.
仅仅依赖于可轻易复制的对象可能导致危险的示例:
因此,无论何时进行memcopying,请记住检查是否可以在特定情况下复制指针,以及是否可以.
在编译器用语中意识到这is_trivially_copyable只是"语法检查",而不是"语义测试".
来自http://en.cppreference.com/w/cpp/types/is_trivially_copyable:
普通可复制类型的对象是唯一可以安全地与
std::memcpy二进制文件一起复制或序列化的C++对象std::ofstream::write()/std::ifstream::read().通常,一个简单的可复制类型是任何类型,其底层字节可以复制到char或unsigned char数组并复制到相同类型的新对象中,并且生成的对象将具有与原始对象相同的值.
具有普通拷贝构造函数,普通拷贝赋值运算符和普通析构函数的对象可以用memcpy或复制memmove
对一个类的特殊成员函数的要求T是微不足道的
T有没有虚成员函数T有没有虚基类T是微不足道的T是微不足道的 T没有volatile限定类型的非静态数据成员(自C++ 14以来)只是声明函数= default不会使它变得微不足道(如果类也支持相应函数的所有其他条件是微不足道的,那将只是微不足道)但是在用户代码中显式写入函数确实可以防止它变得微不足道.还用C语言兼容所有数据类型(POD类型)是平凡可复制.
来源:C++并发实施和cppreference.com
| 归档时间: |
|
| 查看次数: |
2889 次 |
| 最近记录: |