C++中的Trivial 、POD、non-POD和Standard Layout概念
POD types
non-POD types
Standard Layout types
A Formal Definition
Informally, a standard layout class is one without direct or indirect virtual member functions, reference data members or virtual base classes. Formally, a standard-layout class is a class that:
- Has no non-static data members of type non-standard-layout class (or array of such types) or reference. In simpler words, a standard layout class shall not have reference variables as data members or member objects of a non-standard layout class.
- Has no virtual functions and no virtual base classes.
- Has the same access control for all non-static data members.
- Has no non-standard-layout base classes.
- Either has no non-static data members in the most derived class and at most one base class with non-static data members, or has no base classes with non-static data members.
- Has no base classes of the same type as the first non-static data member.
standard-layout 类型的类是指:
- 没有 non-standard-layout类型(或这些类型的数组)和引用的非静态数据成员
没有虚函数和虚基类
- 非静态数据成员的访问控制必须是相同的
- 没有non-standard-layout的基类
在最底层的派生类中没有非静态数据成员,而且在最多有一个基类拥有非静态数据成员,或者没有拥有非静态数据成员
- 相同基类类型的非静态数据成员不能作为第一个成员
C++标准把trivial类型定义如下:
一个拷贝不变(trivially copyable)类型是指:
没有non-trivial 的复制构造函数
没有non-trivial的转移构造函数
- 没有non-trivial的赋值操作符
没有non-trivial的转移赋值操作符
- 有一个trivial的析构函数
更多请参考:
点击(此处)折叠或打开
- 1 // empty classes are trivial
- 2 struct Trivial1 {};
- 3
- 4 // all special members are implicit
- 5 struct Trivial2 {
- 6 int x;
- 7 };
- 8
- 9 struct Trivial3 : Trivial2 { // base class is trivial
- 10 Trivial3() = default; // not a user-provided ctor
- 11 int y;
- 12 };
- 13
- 14 struct Trivial4 {
- 15 public:
- 16 int a;
- 17 private: // no restrictions on access modifiers
- 18 int b;
- 19 };
- 20
- 21 struct Trivial5 {
- 22 Trivial1 a;
- 23 Trivial2 b;
- 24 Trivial3 c;
- 25 Trivial4 d;
- 26 };
- 27
- 28 struct Trivial6 {
- 29 Trivial2 a[23];
- 30 };
- 31
- 32 struct Trivial7 {
- 33 Trivial6 c;
- 34 void f(); // it's okay to have non-virtual functions
- 35 };
- 36
- 37 struct Trivial8 {
- 38 int x;
- 39 static NonTrivial1 y; // no restrictions on static members
- 40 }
- 41
- 42 struct Trivial9 {
- 43 Trivial9() = default; // not user-provided
- 44 // a regular constructor is okay because we still have default ctor
- 45 Trivial9(int x) : x(x) {};
- 46 int x;
- 47 }
- 48
- 49 struct NonTrivial1 : Trivial 3 {
- 50 virtual f(); // virtual members make non-trivial ctors
- 51 }
- 52
- 53 struct NonTrivial2 {
- 54 NonTrivial2() : z(42) {} // user-provided ctor
- 55 int z;
- 56 }
- 57
- 58 struct NonTrivial3 {
- 59 NonTrivial3(); // user-provided ctor
- 60 int w;
- 61 }
- 62 NonTrivial3::NonTrivial3() = default; // defaulted but not on first declaration
- 63 // still counts as user-provided
- 64 struct NonTrivial5 {
- 65 virtual ~NonTrivial5(); // virtual destructors are not trivial
- 66 };
這裏有個幾個例子能讓你彻底明白每個standard-layout類型:
点击(此处)折叠或打开
- 1 // empty classes have standard-layout
- 2 struct StandardLayout1 {};
- 3
- 4 struct StandardLayout2 {
- 5 int x;
- 6 };
- 7
- 8 struct StandardLayout3 {
- 9 private: // both are private, so it's ok
- 10 int x;
- 11 int y;
- 12 };
- 13
- 14 struct StandardLayout4 : StandardLayout1 {
- 15 int x;
- 16 int y;
- 17
- 18 void f(); // perfectly fine to have non-virtual functions
- 19 };
- 20
- 21 struct StandardLayout5 : StandardLayout1 {
- 22 int x;
- 23 StandardLayout1 y; // can have members of base type if they're not the first
- 24 };
- 25
- 26 struct StandardLayout6 : StandardLayout1, StandardLayout5 {
- 27 // can use multiple inheritance as long only
- 28 // one class in the hierarchy has non-static data members
- 29 };
- 30
- 31 struct StandardLayout7 {
- 32 int x;
- 33 int y;
- 34 StandardLayout7(int x, int y) : x(x), y(y) {} // user-provided ctors are ok
- 35 };
- 36
- 37 struct StandardLayout8 {
- 38 public:
- 39 StandardLayout8(int x) : x(x) {} // user-provided ctors are ok
- 40 // ok to have non-static data members and other members with different access
- 41 private:
- 42 int x;
- 43 };
- 44
- 45 struct StandardLayout9 {
- 46 int x;
- 47 static NonStandardLayout1 y; // no restrictions on static members
- 48 };
- 49
- 50 struct NonStandardLayout1 {
- 51 virtual f(); // cannot have virtual functions
- 52 };
- 53
- 54 struct NonStandardLayout2 {
- 55 NonStandardLayout1 X; // has non-standard-layout member
- 56 };
- 57
- 58 struct NonStandardLayout3 : StandardLayout1 {
- 59 StandardLayout1 x; // first member cannot be of the same type as base
- 60 };
- 61
- 62 struct NonStandardLayout4 : StandardLayout3 {
- 63 int z; // more than one class has non-static data members
- 64 };
- 65
- 66 struct NonStandardLayout5 : NonStandardLayout3 {}; // has a non-standard-layout base class
結論:
在新的標准下,很多新類型成为POD類型,而且,就算一個類型不是POD類型,我們也可以分別利用POD類型的特性(只要這個類型是trivial或者standard-layout)。
標准模板塊(STL)在頭文件<type_traits>中定義了對這些類型的檢測:
1 template <typename T> 2 struct std::is_pod; 3 template <typename T> 4 struct std::is_trivial; 5 template <typename T> 6 struct std::is_trivially_copyable; 7 template <typename T> 8 struct std::is_standard_layout;
原文:
阅读(386) | 评论(0) | 转发(1) |
-->
C++中的Trivial 、POD、non-POD和Standard Layout概念的更多相关文章
- (译)Kubernetes中的多容器Pod和Pod内容器间通信
原文:https://www.mirantis.com/blog/multi-container-pods-and-container-communication-in-kubernetes/Pave ...
- K8s中的多容器Pod和Pod内容器间通信
容器(Container)常被用来解决比如微服务的单个问题,但在实际场景中,问题的解决往往需要多容器方案.本文会讨论将多个容器整合进单个Kubernetes Pod 中,以及Pod中的容器之间是如何通 ...
- iOS开发中的错误整理,pod文件Install失败
一.之前用黑苹果,编辑pod文件用一下格式 platform :ios, "8.0" pod "MJExtension" pod "MJRefresh ...
- k8s之pod与Pod控制器
k8s中最为重要的基础资源,pod,pod controller,service pod controller类型有多种需要向控制器赋值之后使用: kubectl命令使用 kubectk get no ...
- Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解
YAML语法规范:在kubernetes k8s中如何通过yaml文件创建pod,以及pod常用字段详解 YAML 语法规范 K8S 里所有的资源或者配置都可以用 yaml 或 Json 定义.YAM ...
- CocoaPods pod install/pod update更新慢的问题
CocoaPods pod install/pod update 最近使用CocoaPods来添加第三方类库,无论是执行pod install还是pod update都卡在了Analyzing d ...
- kubernetes删除pod,pod一直处于Terminating状态
删除pod,pod一直处于Terminating状态 [root@yxz-cluster01 deploy_yaml]# kubectl get pod -n yunanbao NAME READY ...
- 在Salesforce中可以对某一个Object的Standard Button或Link进行重写
在Salesforce中可以对某一个Object的Standard Button或Link进行重写,来实现我们特定的逻辑过程,比如:在删除某个Object之前要判断该Object的某个Field的状态 ...
- Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分
Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分 标签: build targetminSdkVersiont ...
随机推荐
- css控制div下图片自适应解决方法:图片不超过最大宽度
我们(特别是像我一样的菜鸟)经常会遇到一个问题——图片自适应.这个问题是很普遍的.在文章区,在论坛,可以这么说:哪儿需要上传图片,哪儿就存在这个问题,而论坛上也不时有人询问.为什么?原因很简单,我们不 ...
- 洛谷 4106 / bzoj 3614 [HEOI2014]逻辑翻译——思路+类似FWT
题目:https://www.luogu.org/problemnew/show/P4106 https://www.lydsy.com/JudgeOnline/problem.php?id=3614 ...
- spring mvc集成freemarker使用
freemarker作为视图技术出现的比velocity早,想当年struts风靡一时,freemarker作为视图层也风光了一把.但现在velocity作为后起之秀的轻量级模板引擎,更容易得到青睐. ...
- FIR滤波器和IIR滤波器的区别
数字滤波器广泛应用于硬件电路设计,在离散系统中尤为常见,一般可以分为FIR滤波器和IIR滤波器,那么他们有什么区别和联系呢. FIR滤波器 定义: FIR滤波器是有限长单位冲激响应滤波器,又称为非递归 ...
- sql中case when的简单使用
这是一个很多博客都引用的博客,作者未知,但是我第一次看到的就是这个,所以置顶这个吧, 这里有两个我刚才使用的列子: --查询同一机构的签约数和解约数: select t.sgn_acct_issr_i ...
- Linux:远程连接 SSH
一.认识 SSH 定义 SSH(Secure shell):安全外壳协议:是建立在应用层基础上的安全协议: 通过 SSH 进行服务端连接,不容易被窃取信息: 连接服务器 ssh 服务器名 + @ + ...
- 让memcached分布式
memcached是应用最广的开源cache产品,它本身不提供分布式的解决方案,我猜想一方面它想尽量保持产品简单高效,另一方面cache的key-value的特性使得让memcached分布式起来比较 ...
- XAMPP配置8080端口
IIS需要HTTP服务,这个服务占用了80端口. Apache启动不了,为了都可以使用,将Apache端口改为8080.
- 22 mysql有那些”饮鸩止渴”提高性能的方法?
22 mysql有那些”饮鸩止渴”提高性能的方法? 正常的短连接模式是连接到数据库后,执行很少的SQL语句就断开,下次需要的时候再重新连接.如果使用的是短连接,在业务高峰期的时候,就可能出现连接数突然 ...
- git 批量删除本地分支
git branch | grep 'bug' |xargs git branch -D