当前位置: 首页 > news >正文

[c++] 什么是平凡类型,标准布局类型,POD类型,聚合体

这些类型的详细定义都枝词蔓语看,并且随着C++标准的不断发展其含义也不断在修订;因此本文从定性的角度去认识他们。

1. Trivial Type

这种类型构建的时候可以什么事情都不做(平凡构造),这种类型拷贝的时候只需要递归地复制每个标量就可以(平凡复制)。这样做有什么好处呢,随便找块能用的内存std::memmove一下就得到了一个对象。

这种类型真是平凡啊,构造他的时候不用考虑虚表引用什么的初始化,复制的时候简单的内存copy一下就行了,大道至简呀。

Trivial Type的定义:

1. scalar types

2. trivial class

  1. is trivially copyable
  2. 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. 没有虚函数等需要特殊初始化处理的操作。

相关文章:

  • RT-Thread启动流程
  • char * 与 二维字符数组
  • Python 教程之控制流(4)Python 中的循环技术
  • 【历年IJCAI论文下载(含IJCAI2022)】图神经网络(GNN)(多行为推荐、多模态食谱表示学习、同质图表示学习)
  • UNIAPP实战项目笔记3 Swiper部分开发
  • Spring启动源码分析以及生命周期
  • 斜率优化dp
  • 前端开发常用网站整理
  • 直流有刷电机电流采集基于STM32F302R8+X-NUCLEO-IHM07M1
  • 27_GitGitHub
  • 微信公众号在线查题功能系统使用
  • WPS JS宏示例-批量添加链接
  • Java核心——面向对象编程(上)包-继承-多态
  • Ambari自动部署Hadoop集群实战
  • 33.0、C语言——C语言预处理(1) - 翻译环境详解
  • CSS实用技巧干货
  • ES6--对象的扩展
  • JAVA多线程机制解析-volatilesynchronized
  • JS学习笔记——闭包
  • Linux中的硬链接与软链接
  • opencv python Meanshift 和 Camshift
  • Python_网络编程
  • STAR法则
  • vue 个人积累(使用工具,组件)
  • Vue官网教程学习过程中值得记录的一些事情
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端面试之闭包
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 算法---两个栈实现一个队列
  • 我从编程教室毕业
  • 应用生命周期终极 DevOps 工具包
  • 你对linux中grep命令知道多少?
  • 通过调用文摘列表API获取文摘
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​configparser --- 配置文件解析器​
  • #Lua:Lua调用C++生成的DLL库
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (转)母版页和相对路径
  • (转载)hibernate缓存
  • ../depcomp: line 571: exec: g++: not found
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Micro Framework初体验(二)
  • .Net 垃圾回收机制原理(二)
  • .NET 设计一套高性能的弱事件机制
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET和.COM和.CN域名区别