POD类型

Plain Old Data,通常用于说明一个类型的属性,尤其是用户自定义类型。C++11将POD划分为两个概念的合集trivial和standad layout。

POD意义:

1、字节赋值:我们可以安全地使用memset和memcpy对POD类型进行初始化和拷贝等操作;

2、提供对C的内存布局兼容:POD类型的数据在C和C++间的操作总是安全的;

3、保证静态初始化的安全有效:静态初始化很多时候可以提高程序的性能,而POD类型的对象初始化往往更简单。

trivial:

1、拥有普通的默认构造函数,可以通过使用默认构造函数语义实现(=default);

    通常情况下,如果不定义类的构造函数,编译器会默认自动生成一个trivial默认构造函数;但是一旦我们定义了一个构造函数,即使它不包含参数,且函数体里没有代码,该构造函数也不再是trivial。

    如:

    class NoTrivial{

        NoTrivial();

    }

2、拥有普通的copy和move构造函数,同样可以使用(=default);

    trivial copy构造函数等同于使用memcpy进行构造,若不声明,则编译器会自动生成一个trivial copy构造函数,move同理。

3、拥有普通的copy赋值运算符和move赋值运算符,可以使用(=default);

4、拥有普通的析构函数,非virtual;

在C++11中可以利用一些辅助的类模板进行属性判断:

    template<typename T> struct std::is_trivial;

    is_trivial<classname>::value;//value=1,代表trivial;0反之。

standard layout:

1、没有虚函数;

2、没有虚基类;

3、所有非静态成员(non-static)具有相同的访问权限;(public、protect or private)

4、派生类中具有非静态成员,且只有一个仅包含静态成员的基类;

5、基类有非静态成员,而派生类无非静态成员;

6、派生类中第一个非静态成员与其基类类型不同;

---------如果一个类是POD,则其所有非静态成员和基类都是POD.

在C++11中可以利用一些辅助的类模板进行属性判断:

    template<typename T> struct std::is_standard_layout;

    is_standard_layout<classname>::value;//value=1,代表standard_layout;0反之。


如果要判断一个类型是不是POD,标准库<type_traits>也提供了如下模板:

   template<typename T> struct std::is_pod;

    is_pod<classname>::value;//value=1,代表pod;0反之。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值