[c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
这些类型的详细定义都枝词蔓语看,并且随着C++标准的不断发展其含义也不断在修订;因此本文从定性的角度去认识他们。
1. Trivial Type
这种类型构建的时候可以什么事情都不做(平凡构造),这种类型拷贝的时候只需要递归地复制每个标量就可以(平凡复制)。这样做有什么好处呢,随便找块能用的内存std::memmove一下就得到了一个对象。
这种类型真是平凡啊,构造他的时候不用考虑虚表引用什么的初始化,复制的时候简单的内存copy一下就行了,大道至简呀。
Trivial Type的定义:
1. scalar types
2. trivial class
- is trivially copyable
- has one or more eligible default constructors such that each is trivial
3. 上面类型的数组
4. 上面类型的cv限定版本
2. Standard-Layout Type
如果说Trivail Type是C++中的平民,他长什么样子(Object Representations,内存模型)只有他母亲(C++编译器)知道。那么Standard-Layout Type就是程序界的透明人,他长什么样子大家都一清二楚。这种类型有什么好处呢,在不同的编程语言之间大家都可以拿来使用进行交流。
如果说Trivial Type类型关注C++怎么创造他,那么Standard-Layout Type是关注怎么去使用它的身体。因为它的内存布局要确定,因此它的定义比较严格一切跟编译器实现相关的不确定因素都不能有,比如:
1. 子类和父类不能都有非静态成员,因为子类和基类内存布局不确定。
2. 非静态成员必须有相同的访问权限,不同的访问权限段之间内存布局不确定(c++11)。
3. 不能有虚函数,虚继承,引用等跟编译器实现不确定的东西。
4. 不能有有两个一样的基类等影响空基类优化的东西。
5. 所有成员得到内存布局也得是Standard-Layout Type等
3. POD Type
POD是为了C++和C类型兼容而设的概念,同时包含Trivial Type和Standard-Layout Type的含义,随着时代的发展,POD的概念逐渐被更细致的Trivial Type,Standard-Layout Type概念所替代。
4. 聚合体
Aggregate 其实应该跟上面的概念区分开,它是一个纯粹跟C++初始化相关的概念。聚合体可以直接使用花括号对相应的成员进行聚合初始化。
为了能够聚合初始化,其存在一些限制条件:
1. 不能有用户定义继承的构造函数,让编译器负责聚合初始化规则。
2. 对象模型中成员拥有公共访问权限。
3. 没有虚函数等需要特殊初始化处理的操作。
[c++] 什么是平凡类型,标准布局类型,POD类型,聚合体相关推荐
- C++11 POD 类型
POD(Plain Old Data,普通旧数据)类型是从 C++11 开始引入的概念,Plain 代表一个对象是一个普通类型,Old 代表一个对象可以与 C 兼容.通俗地讲,一个类.结构.共用体对象 ...
- C++中的trivial和non-trivial构造/析构/拷贝/赋值函数及POD类型
在侯捷的<STL源码剖析>里提到trivial和non-trivial及POD类型,相关知识整理如下. trivial意思是无意义,这个trivial和non-trivial是对类的四种函 ...
- 【C/C++ POD 类型】深度解析C++中的POD类型:从理论基础到项目实践
深度解析C++中的POD类型:从理论基础到项目实践 1. C++中的POD类型(Plain Old Data) 1.1 POD类型的定义和特性 Trivial类型 Standard layout类型 ...
- C++ trivial和non-trivial构造函数及POD类型(转)
原博客地址http://blog.csdn.net/a627088424/article/details/48595525 最近正纠结这个问题就转过来了,做了点补充(参考<深度探索C++对象模型 ...
- bitset类型, 标准库类型
C++ primer 17.2 bitset类型, 标准库类型 1 使得位运算更容易实现, 并且能够处理超过最长整型大小的位集合. bitset定义在bitset中 定义和初始化bitset 1 bi ...
- c++ string 字符_C/C++知识分享:C++标准库之 string 类型,各种运算全部掌握
简介: C++标准库提供的类型:string.长度可变的字符串,操作简单 仅为包含个人常用函数 头文件 string 类型与其它的标准库类型相同,都需要包含对应的头文件 string 类型的定义和初始 ...
- C/C++知识分享:C++标准库之 string 类型,各种运算全部掌握
简介: C++标准库提供的类型:string.长度可变的字符串,操作简单 仅为包含个人常用函数 头文件 string 类型与其它的标准库类型相同,都需要包含对应的头文件 string 类型的定义和初始 ...
- android卡片 弹簧滑动,如何在滚动android时拉类似于弹性类型的布局?
我有每个布局,看起来像在Scrollview中嵌入的卡片类型.当我滚动时,如何像弹簧式那样移动卡片,然后回到原始位置.如何在滚动android时拉类似于弹性类型的布局? 这就像卡片弹跳.在我的布局中, ...
- html页面布局是什么意思,html布局的常见类型有哪些?html的三种布局特点分析
html布局的常见类型有哪些?html中的布局方式有三种:流动布局.浮动布局以及层模型,html的这三种布局各有个的特点,本篇文章就给大家简单的说说html的三种布局方式的特点. 1.流动布局(htm ...
- C++11 POD类型
POD,全称plain old data,plain代表它是一个普通类型,old代表它可以与c兼容,可以使用比如memcpy()这类c中最原始函数进行操作.C++11中把POD分为了两个基本概念的集合 ...
最新文章
- 『Scrapy』爬虫框架入门
- 巨杉数据库完成数千万美元C轮融资,嘉实投资领投
- Java反斜线(\)路径与转义字符的小坑
- java 队列的数组_JAVA-循环数组实现简单的队列
- .NET 6新特性试用 | DateOnly和TimeOnly类型
- 一建机电实务教材电子版_必背!一建《机电实务》高频考点,每日一背
- 教你玩转CSS表格(table)
- oracle日志文件大小规则,修改oracle日志文件大小
- 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路
- 服装企业的信息管理及主要对象(转)
- matlab做聚类分析瓶面柱状图,MATLAB聚类分析工具箱
- 使用Python识别/提取PDF中的字符、文字
- virtual reality(虚拟现实)
- itest软件测试工具,itest(爱测试)
- 状压DP例题(种花小游戏+广场铺砖)
- mp4 转 m3u8 java_java下载m3u8转ts合成mp4
- STM32MINI板写的超声波代码
- Android-PickerView系列之介绍与使用篇(一)
- 关于BN层的一点理解
- Spring-全面详解(基础知识)