博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++11 pod类型(了解)
阅读量:6996 次
发布时间:2019-06-27

本文共 2976 字,大约阅读时间需要 9 分钟。

啥是POD类型?POD全称Plain Old Data。通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型。平凡的定义1.有平凡的构造函数2.有平凡的拷贝构造函数3.有平凡的移动构造函数 4.有平凡的拷贝赋值运算符 5.有平凡的移动赋值运算符 6.有平凡的析构函数 7.不能包含虚函数 8.不能包含虚基类 [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 #include "stdafx.h" #include 
using namespace std; class A { A(){} }; class B { B(B&){} }; class C { C(C&&){} }; class D { D operator=(D&){} }; class E { E operator=(E&&){} }; class F { ~F(){} }; class G { virtual void foo() = 0; }; class H : G {}; class I {}; int _tmain(int argc, _TCHAR* argv[]) { std::cout << std::is_trivial
::value << std::endl; // 有不平凡的构造函数 std::cout << std::is_trivial::value << std::endl; // 有不平凡的拷贝构造函数 std::cout << std::is_trivial
::value << std::endl; // 有不平凡的拷贝赋值运算符 std::cout << std::is_trivial
::value << std::endl; // 有不平凡的拷贝赋值运算符 std::cout << std::is_trivial
::value << std::endl; // 有不平凡的移动赋值运算符 std::cout << std::is_trivial
::value << std::endl; // 有不平凡的析构函数 std::cout << std::is_trivial
::value << std::endl; // 有虚函数 std::cout << std::is_trivial
::value << std::endl; // 有虚基类 std::cout << std::is_trivial
::value << std::endl; // 平凡的类 system("pause"); return 0; } 运行结果 标准布局的定义 1.所有非静态成员有相同的访问权限 2.继承树中最多只能有一个类有非静态数据成员 3.子类的第一个非静态成员不可以是基类类型 4.没有虚函数 5.没有虚基类 6.所有非静态成员都符合标准布局类型 [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 #include "stdafx.h" #include
using namespace std; class A { private: int a; public: int b; }; class B1 { static int x1; }; class B2 { int x2; }; class B : B1, B2 { int x; }; class C1 {}; class C : C1 { C1 c; }; class D { virtual void foo() = 0; }; class E : D {}; class F { A x; }; int _tmain(int argc, _TCHAR* argv[]) { std::cout << std::is_standard_layout
::value << std::endl; // 违反定义1。成员a和b具有不同的访问权限 std::cout << std::is_standard_layout::value << std::endl; // 违反定义2。继承树有两个(含)以上的类有非静态成员 std::cout << std::is_standard_layout
::value << std::endl; // 违反定义3。第一个非静态成员是基类类型 std::cout << std::is_standard_layout
::value << std::endl; // 违反定义4。有虚函数 std::cout << std::is_standard_layout
::value << std::endl; // 违反定义5。有虚基类 std::cout << std::is_standard_layout
::value << std::endl; // 违反定义6。非静态成员x不符合标准布局类型 system("pause"); return 0; } 运行结果 POD的使用 当一个数据类型满足了”平凡的定义“和”标准布局“,我们则认为它是一个POD数据。可以通过std::is_pod来判断一个类型是否为POD类型。 如文章开头说的,一个POD类型是可以进行二进制拷贝的,看看下面的例子。 [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 #include "stdafx.h" #include
#include
using namespace std; class A { public: int x; double y; }; int _tmain(int argc, _TCHAR* argv[]) { if (std::is_pod
::value) { std::cout << "before" << std::endl; A a; a.x = 8; a.y = 10.5; std::cout << a.x << std::endl; std::cout << a.y << std::endl; size_t size = sizeof(a); char *p = new char[size]; memcpy(p, &a, size); A *pA = (A*)p; std::cout << "after" << std::endl; std::cout << pA->x << std::endl; std::cout << pA->y << std::endl; delete p; } system("pause"); return 0; } 运行结果

可以看到,对一个POD类型进行二进制拷贝后,数据都成功的迁移过来了。

本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/6273021.html,如需转载请自行联系原作者

你可能感兴趣的文章
理解JavaScript中的事件处理
查看>>
Win7 公布网站 HTTP 错误 404.4 - Not Found
查看>>
特征选择方法之信息增益
查看>>
mac jdbc连接mysql
查看>>
Activity生命周期的学习以及Logcat的使用
查看>>
Longest Valid Parentheses leetcode java
查看>>
Android的两种菜单
查看>>
poj 1218 THE DRUNK JAILER
查看>>
WordPress SEO ☞ WordPress网站终极优化指南
查看>>
Environment 常用方法
查看>>
【TYVJ】1338 QQ农场(最大流+最大权闭合图)
查看>>
解决Python2.7的UnicodeEncodeError: 'ascii' codec can’t encode异常错误
查看>>
最近在准备开发进销存管理系统
查看>>
TCP/IP协议
查看>>
【C#】Entity Framework 增删改查和事务操作
查看>>
原创:谨以此文怀念曾经的妹妹
查看>>
作为平台的Windows PowerShell(二)
查看>>
Linux find example
查看>>
jquery之超简单的div显示和隐藏特效demo
查看>>
1、开发自定义组件简要
查看>>