C++中的POD类型

参考

https://en.cppreference.com/w/cpp/named_req/PODType

定义

知识的搬运工,以下内容抄的,虽然是硬性定义,但是希望大家要深刻理解与体会。 POD类型具体要求满足如下条件:

  • 标量类型
  • 满足下列要求的类类型:
  • 为平凡类型, 即要求满足如下条件:
    • 可平凡复制 (TriviallyCopyable),即满足如下条件:
    • 标量类型
    • 可平凡复制类类型,即满足下列条件的类类型:
      • 至少一个复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符是合格的
      • 每个合格的复制构造函数(若存在)均为平凡的
      • 每个合格的移动构造函数(若存在)均为平凡的
      • 每个合格的复制赋值运算符(若存在)均为平凡的
      • 每个合格的移动赋值运算符(若存在)均为平凡的
      • 拥有一个平凡而未弃置的析构函数
      • 可平凡复制 (TriviallyCopyable) 对象的数组 满足以上条件,意味着平凡复制类 没有虚函数或虚基类
    • 若该类型是类类型或其数组,则该类拥有一个或多个合格的默认构造函数,均为平凡的。
    • 一个默认构造函数为合格当且仅当它不是弃置的。
  • 为标准布局类型,即要求:
    • 所有非静态数据成员必须具有相同的访问控制
    • 没有虚函数或虚基类
    • 没有引用类型的非静态数据成员
    • 所有非静态数据成员和基类自身也是标准布局类型
    • 不存在两个相同类型的(可能间接的)基类子对象
    • 所有非静态数据成员和位域都在同一类中声明(要么全在派生类中,要么全在某个基类中)
    • 不存在与如下各项具有相同类型的基类子对象
    • 对于非联合类型,为其首个非静态数据成员(见空基类优化),递归地,若该数据成员具有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
    • 对于联合体类型,为其任何非静态数据成员,递归地,若该数据成员具有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
    • 对于数组类型,为数组元素的类型,递归地,若该数据成员拥有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
  • 没有非 POD 的非静态成员
  • 这种类型的数组

总结与理解

  1. 从最终根本上讲,POD类型,保证了与C语言类型兼容,能直接以其二进制形式与 C 库交互。
  2. 要满足非凡类型,是因为:保证了对象可以进行复制,并且对一个对象二进制拷贝后,该对象的全部属性都被copy了。
  3. 要满足标准布局,是因为:保证该数据结构可以与其他语言编写的代码交流。大家风格一致,是最平凡的布局。 不会因为一些语言特性导致内存布局有差异。例如c++的虚函数、多继承等会导致由于虚表指针和多个基类之间的字节对齐引起的内存布局有差异。

Original: https://www.cnblogs.com/yinheyi/p/14854330.html
Author: 殷大侠
Title: C++中的POD类型

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535568/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C++接口设计和代码重构

    讲了接口设计, 文档(doxygen),测试等方面。对于从头编写基础库, 或者没有基础库开发经验并且需要短期内上手, 有一定实际参考价值。 所谓Mikado Method方法是用来…

    C++ 2023年5月29日
    055
  • 【C++】第1章 在VS2015中用C++编写控制台应用程序

    分类:C++、VS2015 创建日期:2016-06-12 看到不少人至今还在用VC 6.0开发工具学习C++,其实VC 6.0开发工具早就被淘汰了。这里仅介绍学习C++时推荐使用…

    C++ 2023年5月29日
    068
  • 聊聊 C++ 大一统的初始化运算符 {}

    一:背景 最近发现 C++ 中的类型初始化操作,没有 {} 运算符搞不定的,蛮有意思,今天我们就来逐一列一下各自的用法以及汇编展现,本来想分为 值&#…

    C++ 2023年5月29日
    030
  • C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)

    C++11 并发指南已经写了 5 章,前五章重点介绍了多线程编程方面的内容,但大部分内容只涉及多线程、互斥量、条件变量和异步编程相关的 API,C++11 程序员完全可以不必知道这…

    C++ 2023年5月29日
    051
  • [转] C++ STL中map.erase(it++)用法原理解析

    总结一下map::erase的正确用法。首先看一下在循环中使用vector::erase时我习惯的用法: 这一种用法是没有问题的。 如上所示,C++98中map::erase并没有…

    C++ 2023年5月29日
    072
  • C++11 右值引用和转移语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Se…

    C++ 2023年5月29日
    085
  • (筆記) 如何寫入binary file某個byte的值? (C/C++) (C)

    Abstract通常公司為了保護其智慧財產權,會自己定義檔案格式,其header區會定義每個byte各代表某項資訊,所以常常需要直接對binary檔的某byte直接進行寫入。 In…

    C++ 2023年5月29日
    049
  • C++:继承访问属性(public/protected/private)

    我不去想是否能够成功 既然选择了远方 便只顾风雨兼程 Original: https://www.cnblogs.com/adylee/p/11432895.htmlAuthor:…

    C++ 2023年5月29日
    076
  • c++11新特性学习2

    noexcept 替代 throw。优点是更安全, 如果noexcept 修饰的函数抛出了异常,编辑器可以直接选择终止程序。 C++ 11中析构函数默认为noexcept(true…

    C++ 2023年5月29日
    047
  • C++中的float&double的存储原理

    参考:https://cloud.tencent.com/developer/article/1473541 对于任何数字表示成二进制科学计数法以后,一定是1点几(尾数)乘以2的多…

    C++ 2023年5月29日
    044
  • WIN部分程序调用VS C++库导致提示报错R6034解决方法

    最近电脑上的部分软件运行的时候有时候会报错R6034,猜测可能是软件安装冲突导致 可能是因为软件在调用VS C++runtime error库的dll文件的时候找不到或者找到了错误…

    C++ 2023年5月29日
    083
  • C++ #ifndef、#define、#endif作用

    在C++项目中,#ifndef、#define、#endif非常常见,接下来就来简单说一下它们的作用。 作用:防止头文件被重复引用,防止被重复编译。 简介: ifndef 它是if…

    C++ 2023年5月29日
    082
  • 当C++遇到iOS应用开发之—List集合

    在Object-c中,数组使用NSArray和NSMutableArray(可变长数组)。使用语法如下: NSArray *array = [[NSArray alloc] ini…

    C++ 2023年5月29日
    062
  • C++STL之双端队列容器

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/huashanqingzhu/p/12832819.ht…

    C++ 2023年5月29日
    066
  • UNITY 手游(安卓)如何使用C/C++代码

    解决方案:将C/C++代码编译成so供C#代码调用。 SO生成工具:android studio,简称AS 一,so 生成方法: 1,菜单:File->New->New…

    C++ 2023年5月29日
    079
  • 您的第一个C++Builder程序(Hello, world!)

    最近有些老旧的项目是C++Builder开发的,虽然和Delphi的IDE的界面和操作十分相似,但是还是找本《C++ Builder 5 Developer’s Gui…

    C++ 2023年5月29日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球