C++:TrivialStandard-Layout 和 POD
Posted coredump
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++:TrivialStandard-Layout 和 POD相关的知识,希望对你有一定的参考价值。
是 C++11 开始引入的语法。如果两者没有区别,又何必多此一举。所以,答案是肯定的,这两种方式是有区别的。那区别在哪里呢? ,可以简单翻译成“普通(平凡)类型”。当一个类型(class
/ struct
)同时满足以下几个条件时,它就是 trivial type
:
没有虚函数或虚基类。 由编译器生成默认的特殊成员函数,包括默认构造函数、拷贝构造函数、移动构造函数、赋值运算符、移动赋值运算符和析构函数。 数据成员同样需要满足条件 1 和 2。
所以,上面的例子中,如果使用了 A()
则 class A
是 non-trivial type
;如果使用的是 A() = default;
则 class A
是 trivial type
。
或 struct
)同时满足以下几个条件时是标准布局(standard-layout
)类型:没有虚函数或虚基类。 所有非静态数据成员都具有相同的访问说明符(public
/ protected
/ private
)。 在继承体系中最多只有一个类中有非静态数据成员。 子类中的第一个非静态成员的类型与其基类不同。
前 3 个条件都很好理解。第 4 条起来就有点不好理解了,来看一个例子。
和 struct C
都满足前 3 个条件。struct B
不满足第 4 个条件,所以它不是 standard layout
。
struct C
满足第 4 个条件,所以它是 standard layout
。
第 4 个条件的产生是因为 C++ 允许优化不包含成员基类:
在 C++ 标准中,如果基类没有任何数据成员,基类应不占用空间。所以,C++ 标准允许派生类的第一个成员与基类共享同一地址空间。 但是,如果派生类的第一个非静态成员的类型和基类相同,由于 C++ 标准要求相同类型的不同对象的地址必须不同,编译器就会为基类分派一个字节的地址空间。
对 POD 类型对象进行赋值操作。
当一个类型(class
/ struct
)同时满足以下几个条件时,它就是 trivial type
:
没有虚函数或虚基类。 由编译器生成默认的特殊成员函数,包括默认构造函数、拷贝构造函数、移动构造函数、赋值运算符、移动赋值运算符和析构函数。 数据成员同样需要满足条件 1 和 2。
所以,上面的例子中,如果使用了 A()
则 class A
是 non-trivial type
;如果使用的是 A() = default;
则 class A
是 trivial type
。
或 struct
)同时满足以下几个条件时是标准布局(standard-layout
)类型:没有虚函数或虚基类。 所有非静态数据成员都具有相同的访问说明符(public
/ protected
/ private
)。 在继承体系中最多只有一个类中有非静态数据成员。 子类中的第一个非静态成员的类型与其基类不同。
前 3 个条件都很好理解。第 4 条起来就有点不好理解了,来看一个例子。
和 struct C
都满足前 3 个条件。struct B
不满足第 4 个条件,所以它不是 standard layout
。
struct C
满足第 4 个条件,所以它是 standard layout
。
第 4 个条件的产生是因为 C++ 允许优化不包含成员基类:
在 C++ 标准中,如果基类没有任何数据成员,基类应不占用空间。所以,C++ 标准允许派生类的第一个成员与基类共享同一地址空间。 但是,如果派生类的第一个非静态成员的类型和基类相同,由于 C++ 标准要求相同类型的不同对象的地址必须不同,编译器就会为基类分派一个字节的地址空间。
对 POD 类型对象进行赋值操作。
C++ 提供了 std::is_pod<T>
来判断一个类型是不是 POD 类型。
不过,从 C++20 开始,POD 这个概念被开始淡化,std::is_pod<T>
这个模板库也被废弃,转而用 trivial
和 standard-layout
两个概念代替。
所以,如果一个对象既是 trivial
又是 standard-layout
,那么这个对象就是 POD 类型。
std::is_pod<T> == std::is_trivial<T> && std::is_standard_layout<T>
C++语法小记---标准库
C++标准库
-
C++标准库包含如下内容:
-
C++标准编译工具链
-
C++扩展编译工具链(各种C++编译器独有)
-
C++标准库
-
C++库
-
C库
-
-
C兼容库(为了兼容能够用C编译器编译的项目,直接使用C++也能编译)
-
C++扩展库(各种C++编译器独有)
-
-
C++标准库都在std名称空间中
-
C库和C兼容库的内容其实完全相同,只是头文件的名称不同,因为C++设计之初就是为了完全兼容C
C库 | C兼容库 |
cstdio | stdio.h |
cmath | math.h |
以c字母开头 | 后缀是.h |
以上是关于C++:TrivialStandard-Layout 和 POD的主要内容,如果未能解决你的问题,请参考以下文章
[C++]C++入门到入土篇 HelloWorld 解析 && C++入门