目录

  • 前言
    • 聚合
    • POD(Plain Old Data)
    • 平凡类型(TrivialType)
      • 要求
    • 平凡可复制(TrivialCopyable)
      • 要求
      • 对于某些函数的补充说明
        • 平凡拷贝构造函数
        • 符合条件的移动构造函数
        • 符合条件的拷贝赋值运算符
        • 符合条件的移动赋值运算符
        • 符合条件的析构函数
    • 标准布局类型(Standard-layout Type)
    • 标准布局兼容
  • 例子
  • 总结
  • 引用博客
  • 非常值得阅读的讨论

前言

因为要整理近期学习的c++特性,特地出一篇来介绍POD类型和c++11引进的TrivialStandard-layout

聚合

聚合是以下类型之一:

  • 数组类型
  • 类类型(通常,struct或union)具有
没有用户声明的构造函数 (直到 C++11)
没有用户提供的构造函数(允许显式默认或删除的构造函数) (C++11 起) (C++17 前)
没有用户提供的、继承的或显式(explicit,c++17特意新加)的构造函数(允许显式默认或删除的构造函数) (C++17 起) (C++20 前)
没有用户声明或继承的构造函数(相当于=default不行了) (C++20 起)
  • 没有virtualprivateprotected (C++17 起)基类
  • 没有虚拟成员函数
没有默认的成员初始化器 (C++11 起) (C++14 前)

聚合初始化。它是列表初始化 (C++11 起)或直接初始化 (C++20 起)的一种形式

POD(Plain Old Data)

POD规范着对象的类型,主要是为了兼容C,C++可以直接使用C库函数操作POD数据类型,拥有POD特征的类或结构体通过直接字节拷贝或二进制拷贝后依然能保持数据结构不变,POD类型在C和C++间的操作总是安全的。

特征:

  • 标量类型(算术类型(整型/浮点型)、指针、成员指针、枚举类型)
  • 类类型(class、struct、union)
    • 从c++11起

      • 是平凡(trivial)类型(后续介绍)
      • 是标准布局(standard-layout)类型(后续介绍)
      • 所有非静态成员都是POD类型

特性:

  • 完全与C兼容,但是仍然可以有成员函数;POD类型标准到甚至可以与其他语言兼容;
  • 可以用std::memcpy拷贝(对于非POD类型,即使满足TriviallyCopyable,用std::memcpy拷贝的行为也是未定义的)
  • 有更长的生命周期,从资源获取到资源释放,而非POD类型的是从构造函数结束到析构函数结束;
  • POD类型对象的前部没有填充字节,即对象指针与第一个成员的指针是相等的

来自cppreference:PODType

平凡类型(TrivialType)

要求

  • 平凡可复制
  • 如果类型是类类型或其数组,则该类具有一个或多个符合条件的默认构造函数,所有这些构造函数都是平凡的。

来自cppreference:TrivialType

平凡可复制(TrivialCopyable)

要求

以下类型统称为平凡可复制类型

  • 标量类型
  • 可简单复制的类,即满足以下要求的类:
    • 至少一个拷贝构造函数、移动构造函数、复制赋值运算符或移动赋值运算符符合条件
    • 每个符合条件的拷贝构造函数(如果有的话)都是平凡的
    • 每个符合条件的移动构造函数(如果有)都是平凡的
    • 每个符合条件的复制赋值运算符(如果有)都是平凡的
    • 每个符合条件的移动赋值运算符(如果有)都是平凡的
    • 有一个平凡的的未删除析构函数
      • 这里有很多符合条件的要求,但大致如下

        • 如果未删除函数(拷贝构造、移动构造、拷贝赋值、移动赋值 (标准c++20前)),则它是符合条件的。符合条件的函数(上述四者)的平凡性决定了该类是否是隐式生命周期类型,以及该类是否是可平凡复制的类型
      • 这里有很多平凡的概念,但大致如下
        • 它不是用户提供的(意思是,它是被隐式定义或默认的)
        • 所在类没有虚拟,包括虚基类和虚成员函数
        • 对每个非静态类型类型(或类类型数组)成员,递归该要求
  • 平凡可复制对象 的数组

这意味着一个平凡可复制的类没有虚函数或虚基类。

来自cppreference:TriviallyCopyable

使用is_trivially_copyable(C++11)可判断类型是否是平凡可复制的

std::is_trivially_copyable

对于某些函数的补充说明

平凡拷贝构造函数

平凡可复制对象可以通过手动复制其对象表示来复制,例如使用std::memmove。所有与 C 语言兼容的数据类型(POD 类型)都可以轻松复制。

符合条件的移动构造函数

平凡移动构造函数是执行与普通拷贝构造函数相同的操作的构造函数,也就是说,就像通过std::memmove一样制作对象表示的副本。所有与 C 语言兼容的数据类型(POD 类型)都可以轻松移动。

符合条件的拷贝赋值运算符

平凡拷贝赋值运算符生成对象表示的副本,就像通过std::memmove一样。所有与 C 语言兼容的数据类型(POD 类型)都可以简单地拷贝分配。

符合条件的移动赋值运算符

平凡移动赋值运算符执行与平凡拷贝赋值运算符相同的操作,即生成对象表示的副本,就像std::memmove一样。所有与C语言兼容的数据类型(POD类型)都可以简单地移动赋值。

符合条件的析构函数

平凡析构函数是不执行任何操作的析构函数。具有普通析构函数的对象不需要删除表达式,并且可以通过简单地释放它们的存储来处理。所有与 C 语言兼容的数据类型(POD 类型)都可以轻松破坏。

标准布局类型(Standard-layout Type)

标准布局规范着对对象的布局。标准布局类型对于与用其他编程语言编写的代码进行通信很有用。
当类或结构不包含某些C++语言功能(例如无法在C语言中找到虚函数),并且所有成员都具有相同的访问控制时,该类或结构为标准布局类型。可以在内存中对其进行复制,并且布局已经充分定义,可以由C程序使用。标准布局类具有用户定义的特殊成员函数。此外有以下特征

  • 所有非静态数据成员具有相同的访问控制
  • 没有虚函数或虚基类
  • 没有引用类型的非静态数据成员
  • 类类型的所有非静态成员和基类本身都是标准布局类型
  • 没有与第一个非静态数据成员类型相同的基类
  • 满足以下条件之一:
    • 最底层派生类中没有非静态数据成员,并且具有非静态数据成员的基类不超过一个(换言之继承树中最多只能有一个类有非静态数据成员),或者
    • 没有含非静态数据成员的基类

举两个例子,Base类和Derived类中都有非静态数据成员,因为当Derived继承于Base,有std::is_standard_layout<Derived>为falsestd::is_standard_layout<Base>为true

struct Base
{int i;int j;
};// std::is_standard_layout<Derived> == false!
struct Derived : public Base
{int x;int y;
};

Derived 是标准布局,因为 Base 没有非静态数据成员:

struct Base
{void Foo() {}
};// std::is_standard_layout<<Derived> == true
struct Derived : public Base
{int x;int y;
};

标准布局兼容

涉及两个或两个以上满足标准布局的数据结构兼容问题,概括起来有点复杂,先直接抛cppreference链接看吧(后续再细看),在标准布局内容下边

例子

类A满足POD类型要求,即可直接通过字节拷贝 拷贝其数据,在此情形下,字节拷贝效率是很快的

class A
{public:int a;int b;
};int main()
{A a1;a1.a = 10;a1.b = 20;char* p = new char[sizeof(A)];memcpy(p, &a1, sizeof(A));A* a2 = reinterpret_cast<A*>(p);cout << a2->a << "\n" << a2->b << "\n";
}

总结

POD概念在C98中被提出,在C++20被启用,取而代之的是在C++11引入的TrivialStandard-layout类型,因本文所介绍内容在《深度探索C++对象模型》中会被重点介绍,待后续阅读完此书籍后,再对本文进行更多补充

引用博客

聚合类型与POD类型

C++中的POD类型

《深度探索C++对象模型》

非常值得阅读的讨论

附带POD在各个语言标准的演变 变化
What are Aggregates and PODs and how/why are they special?

c++ 聚合/POD/平凡/标准布局 介绍相关推荐

  1. Russ Cox:这不是Go项目的标准布局 | Gopher Daily (2021.04.28) ʕ◔ϖ◔ʔ

    每日一谚:Profile before you decide something is performance critical. Go技术生态 Go web开发的当前状态 - https://tno ...

  2. C++的iostream标准库介绍

    C++的iostream标准库介绍 0 为什么需要iostream 1 iostream: istream 和 ostream 2 fstream: ifstream 和 ofstream 3 str ...

  3. 《金蝶ERP—K/3标准财务模拟实训(11.X版)》——第1章 金蝶K/3标准财务介绍 1.1 金蝶K/3标准财务系统介绍...

    本节书摘来自异步社区<金蝶ERP-K/3标准财务模拟实训(11.X版)>一书中的第1章,第1.1节,作者 龚中华,何亮,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  4. python的threading库_python标准库介绍——31 threading 模块详解

    threading 模块 (可选) ``threading`` 模块为线程提供了一个高级接口, 如 [Example 3-1 #eg-3-1] 所示. 它源自 Java 的线程实现. 和低级的 ``t ...

  5. html5/css3响应式布局介绍及设计流程

    html5/css3响应式布局介绍 html5/css3响应式布局介绍及设计流程,利用css3的media query媒体查询功能.移动终端一般都是对css3支持比较好的高级浏览器不需要考虑响应式布局 ...

  6. html5/css3响应式布局介绍

    转载链接:http://www.51xuediannao.com/html+css/htmlcssjq/694.html html5/css3响应式布局介绍 html5/css3响应式布局介绍及设计流 ...

  7. 标准布局类(11中布局类)

    2019独角兽企业重金招聘Python工程师标准>>> <div class="box"><div id="myAuto" ...

  8. Android:线性布局介绍,线性布局weight属性,线性布局微调参数gravity,线性布局divider

      LinearLayout:线性布局 一.线性布局介绍 新建一个工程 然后我们默认的布局,是相对布局, 相对布局的意思是我的控件可以在里面随意放置 那如果把这个RelativeLayout 改了呢? ...

  9. Linux目录标准FHS介绍

    Linux目录标准FHS介绍 Linux和UNIX的文件系统是一个以"/ "为根的阶层式的树状文件结构,/ 因此被称为根目录.所有的文件和目录都置于根目录/ 之下.根目录/下面有/ ...

  10. (转)WPF面板布局介绍Grid、StackPanel、DockPanel、WrapPanel

    回顾 上一篇,我们介绍了基本控件及控件的重要属性和用法,我们本篇详细介绍WPF中的几种布局容器及每种布局容器的使用场景,当 然这些都是本人在实际项目中的使用经验,可能还存在错误之处,还请大家指出. 本 ...

最新文章

  1. OpenCL框架与示例
  2. TensorRT Samples: GoogleNet
  3. WdatePicker,js日期插件 ,时间相加
  4. TextArea的滚动条看不到了,可能与height有关
  5. Unix编程艺术心得
  6. android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)...
  7. DelphiXE开发坑
  8. 小米手机如何升级Android版本,小米手机如何从稳定版升级到开发版
  9. 手把手DES加密解密详解-Java,Python
  10. html中如何在数字上加方框,EXCEL单元格中方框添加数字(或者数字添加方框)
  11. 在中国程序员工作是青春饭吗?
  12. 【文件处理】python 在线预览文件_OFFICE 文档转换为html在线预览
  13. 什么是大数据可视化,有什么作用?
  14. 何为非侵入式负荷分解
  15. 二叉树排序和绘制技巧
  16. calendar 5 android版,calendars 5 安卓
  17. C++课程设计报告--通讯录管理系统
  18. AdVoice广告录音制作软件如何音乐语音混音穿插制作广告
  19. 电脑问题处理篇7:解决U盘无法存放4GB以上大小文件的问题
  20. 类似AV终结者的病毒分析

热门文章

  1. 哥德巴赫猜想python
  2. Pytorch Tutorial 学习笔记(六)模型部署
  3. Insert Guest Additions CD image 没有反应
  4. 【pyecharts | 颜色配置】关于pyecharts中自定义颜色问题详解
  5. java下一页按钮_如何仅使用Spring在Java中单击提交按钮后才能转到下一页
  6. 沈阳市中考计算机考试时间,2017沈阳市中考考试科目及时间
  7. 23位子网掩码是多少_子网掩码23位的是多少
  8. AE-摄影机和跟踪器
  9. html鼠标移动到文字改变样式,css实现鼠标滑过改变文字(中文变英文)
  10. 高频信号发生器设计—串联型晶体振荡电路