C++:TrivialStandard-Layout 和 POD

Posted coredump

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++:TrivialStandard-Layout 和 POD相关的知识,希望对你有一定的参考价值。

是 C++11 开始引入的语法。如果两者没有区别,又何必多此一举。所以,答案是肯定的,这两种方式是有区别的。那区别在哪里呢?

 ,可以简单翻译成“普通(平凡)类型”。

当一个类型(class / struct )同时满足以下几个条件时,它就是 trivial type

  1. 没有虚函数或虚基类。
  2. 由编译器生成默认的特殊成员函数,包括默认构造函数、拷贝构造函数、移动构造函数、赋值运算符、移动赋值运算符和析构函数。
  3. 数据成员同样需要满足条件 1 和 2。

所以,上面的例子中,如果使用了 A() class Anon-trivial type;如果使用的是 A() = default;class Atrivial type

struct )同时满足以下几个条件时是标准布局(standard-layout)类型:

  1. 没有虚函数或虚基类。
  2. 所有非静态数据成员都具有相同的访问说明符(public / protected / private)。
  3. 在继承体系中最多只有一个类中有非静态数据成员。
  4. 子类中的第一个非静态成员的类型与其基类不同。

前 3 个条件都很好理解。第 4 条起来就有点不好理解了,来看一个例子。

struct C 都满足前 3 个条件。

struct B 不满足第 4 个条件,所以它不是 standard layout

struct C 满足第 4 个条件,所以它是 standard layout

第 4 个条件的产生是因为 C++ 允许优化不包含成员基类

  1. 在 C++ 标准中,如果基类没有任何数据成员,基类应不占用空间。所以,C++ 标准允许派生类的第一个成员与基类共享同一地址空间
  2. 但是,如果派生类的第一个非静态成员的类型和基类相同,由于 C++ 标准要求相同类型的不同对象的地址必须不同,编译器就会为基类分派一个字节的地址空间。
对 POD 类型对象进行赋值操作。

  • 与 C 语言内存布局兼容,POD 类型的数据可以使用 C 函数进行操作且是安全的。
  • 保证了静态初始化的安全有效。
  • C++ 提供了 std::is_pod<T> 来判断一个类型是不是 POD 类型。

    不过,从 C++20 开始,POD 这个概念被开始淡化,std::is_pod<T>  这个模板库也被废弃,转而用 trivialstandard-layout 两个概念代替。

    所以,如果一个对象既是 trivial 又是 standard-layout,那么这个对象就是 POD 类型。

    std::is_pod<T> == std::is_trivial<T> && std::is_standard_layout<T>

    C++语法小记---标准库

    C++标准库
    C库 C兼容库
    cstdio stdio.h
    cmath math.h
    以c字母开头 后缀是.h

    以上是关于C++:TrivialStandard-Layout 和 POD的主要内容,如果未能解决你的问题,请参考以下文章

    C++之父的C++元宇宙

    [C++]C++入门到入土篇 HelloWorld 解析 && C++入门

    怎么找C++函数需要的头文件?(C++头文件C++函数文档C++文档)

    如何识别项目是托管 c++ 项目还是非托管 c++ 项目

    C++ 程序员应该使用哪些 C++ 习语? [关闭]

    十类C++标准库 十类C++标准库简介

    (c)2006-2019 SYSTEM All Rights Reserved IT常识