美文网首页
[C++11阅读][2-3-3]POD类型(上)

[C++11阅读][2-3-3]POD类型(上)

作者: 凌霄阁2010 | 来源:发表于2020-06-06 08:47 被阅读0次

POD是Plain Old Data的缩写。POD类型是C++11中其他概念的基础,在后续会看到各处的应用。
Plain指的是每个类都有这样的属性,Old指的是与C的兼容,比如用memcpy()、memset()进行赋值。
C++11将POD划分成两个基本概念的合集:平凡的(trivial)和标准布局的(standard layout)。
两个条件是缺一不可的。

trivial

一个平凡的类或结构体应当符合以下条件:

  1. 拥有平凡的默认构造函数和默认析构函数
    当自定义了构造/析构函数时,默认函数会被删掉,哪怕自定义的构造/析构函数啥也没干,也会不符合trivial。
    有个技巧是可以通过=default关键帧恢复trivial。
  2. 拥有平凡的拷贝构造函数和移动构造函数
  3. 拥有平凡的拷贝赋值运算符和移动赋值运算符
  4. 不能包含虚函数以及虚基类
    我们看几个示例。
#include <iostream>
#include <type_traits>
using namespace std;
struct Trivial1 {};
struct Trivial2 {
public:
    int a;
private:
    int b;  // 同时有public和private符合trivial,但不符合standard layout
};
struct Trivial3 {
    Trivial1 a;
    Trivial2 b;
};
struct Trivial4 {
    Trivial2 a[23];
};
struct Trivial5 {
    int x;
    static int y;  // 同时也是standard layout和pod
};
struct NonTrivial1 {
    NonTrivial1(): z(42) {}
    int z;
};
struct NonTrivial2 {
    NonTrivial2();
    int w;
};
NonTrivial2::NonTrivial2() = default;  // 实测这样写无法恢复,但写在里面是可以的
struct NonTrivial3 {
    Trivial5 c;
    virtual void f();
};
int main() {
    cout << is_trivial<Trivial1>::value << endl;
    cout << is_trivial<Trivial2>::value << endl;
    cout << is_standard_layout<Trivial2>::value << endl;  // 0
    cout << is_pod<Trivial2>::value << endl;  // 0
    cout << is_trivial<Trivial3>::value << endl;
    cout << is_trivial<Trivial4>::value << endl;
    cout << is_trivial<Trivial5>::value << endl;
    cout << is_standard_layout<Trivial5>::value << endl;  // 1
    cout << is_pod<Trivial5>::value << endl;  // 1
    cout << is_trivial<NonTrivial1>::value << endl;
    cout << is_trivial<NonTrivial2>::value << endl;
    cout << is_trivial<NonTrivial3>::value << endl;
}

相关文章

  • [C++11阅读][2-3-3]POD类型(上)

    POD是Plain Old Data的缩写。POD类型是C++11中其他概念的基础,在后续会看到各处的应用。Pla...

  • 【译】C++ POD的理解(1):aggregates

    在阅读《深入理解C++11》时对POD的理解有些疑惑,stack overflow上有一篇高分回答写得非常棒,现在...

  • 【译】C++ POD的理解(2):PODs

    在阅读《深入理解C++11》时对POD的理解有些疑惑,stack overflow上有一篇高分回答写得非常棒,现在...

  • [C++11阅读][2-3-4]POD类型(中)

    standard layout 本篇会简单涉及C++编译器如何在内存里排列成员变量。标准布局指的是类的成员变量排布...

  • [C++11阅读][2-3-4]POD类型(下)

    POD的好处 用is_pod::value可以判断是否是POD,头文件是#include ...

  • 深入理解C++11 3.6 POD类型

    POD全程Plain Old Data。C++11将POD划分为两个基本概念的集合,即:平凡的(trivial)和...

  • C++11新特性

    强类型枚举 在C++11之前,枚举类型全局可见,两种枚举之间不可以叫相同名称。而C++11中不同枚举类型内部不会互...

  • pod

    ## POD 类型 当某一类或结构同时为普通和标准布局时,该类或结构为 POD(简单旧数据)类型。 因此,POD ...

  • C++11的类型推导详解

    auto & decltype 关于C++11新特性,最先提到的肯定是类型推导,C++11引入了auto和decl...

  • C++11中auto和decltype

    C++11中auto和decltype auto和decltype都是C++11中引进来用于自动推断类型的关键字,...

网友评论

      本文标题:[C++11阅读][2-3-3]POD类型(上)

      本文链接:https://www.haomeiwen.com/subject/sqjazhtx.html