C++ 代码风格准则:POD
2024-09-14 21:08:36
作者:一根筋的傻瓜
链接:https://www.zhihu.com/question/36379130/answer/69853366
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://www.zhihu.com/question/36379130/answer/69853366
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
POD,全称plain old data,plain代表它是一个普通类型,old代表它可以与c兼容,可以使用比如memcpy()这类c中最原始函数进行操作。C++11中把POD分为了两个基本概念的集合,即:平凡的(trival)和标准布局的(standard layout)。
- 首先是平凡的(trival)定义,通常一个平凡的类或者结构体需要满足以下定义:
- 拥有平凡的默认构造函数和析构函数。默认的意思就是由编译器为我们自动生成的,不许是我们自己定义的,但是由于c++11提供了default,也可以是自己定义的加=default,比如
struct Trival{
Trival(){}=default;
}
就是满足这个要求的,而
struct noTrival{
noTrival(){};
}
就不满足这个要求(哪怕我们定义的构造函数体里面啥都没有)。这个要求对于带参的构造函数没有束缚。你可以自定义带参的构造函数。
- 拥有平凡的拷贝构造函数和移动构造函数。默认的意思同上,也可以使用=default。
- 拥有平凡的拷贝赋值操作符和移动赋值操作符。
- 不能包含虚函数和虚基类。
2.接下来是标准布局的定义:
- 所有非静态成员拥有相同的访问级别,(访问级别就是public,private,protected),
struct t1{
private :
int a;
public:
int b;
}就不满足标准布局,因为a,b访问级别不同。
- 在类和结构体继承时需要满足以下两个情况之一:
- 派生类中有非静态类,那么这个派生类只能有且只有一个仅包含了静态成员的基类。
- 基类有非静态成员,那么派生类中不允许有非静态成员。
(这两句话看着挺绕口,其实就是在说明一个事实,关于非静态数据的事实,派生类中有非 静态的数据那么它的基类只能是只有静态的,而且基类只能有一个。如果基类有非静态的, 那么派生类就不能有非静态的。有种跷跷板的感觉,非静态的对面坐着的是静态,父子类就 是坐在跷跷板的两端这种对应关系。)
- 类中第一个非静态类型与基类不是同一个类型。比如
struct A:B{
B b;
int c;
}就不符合这个条件。因为A中第一个成员是基类B类型的。
- 没有虚类和虚基类(与trival中重复)
- 所有非静态数据成员都符合标准布局的要求,这其实就是一个递归的定义。
所以在C++11中,POD就是满足平凡的(trival)和标准布局(standard layout)这两个方面。可以使用<type_traits>中的is_pod<T>::value判断T是不是POD类型的。
说了这么多,那么为什么我们需要POD这种条件满足的数据呢?
- 可以使用字节赋值,比如memset,memcpy操作
- 对C内存布局兼容。
- 保证了静态初始化的安全有效。
最新文章
- 关于试用jquery的jsonp实现ajax跨域请求数据的问题
- AC日记——数字统计 openjudge 1.5 41
- 如何通过java代码对kylin进行cube build
- Spring AOP报错处理 Can not set field to $Proxy 在spring中使用事物或AOP遇到的错误
- C#中的委托
- 推荐:移动端前端UI库—Frozen UI、WeUI、SUI Mobile
- Hibernate工作原理及为什么要用?
- codeforces 630F Selection of Personnel(组合数)
- jquery插件cloud-zoom(放大镜)
- 关于redhat6的服务说明
- rails tutorial sample app
- 团队作业八——第二次团队冲刺(Beta版本)第3天
- odoo中def init(self):
- Spring Boot (一)快速入门
- Centos7安装美团SQL优化工具SQLAdvisor
- php 把一个数组分成几个数组
- es_5.4.4 reinstall log and upgrade to V6.5.4--APM
- linux入门001--帮助支持
- makefile的一个错误:*** missing separator
- 8分钟丨教你玩转 API
热门文章
- Python开发基础-Day15正则表达式爬虫应用,configparser模块和subprocess模块
- Linux基础系列-Day4
- 最近升级mysql5.7出现下面问题,ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_group_by
- 【后缀自动机】poj1509 Glass Beads
- 【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 [SDOI2011]计算器
- 20172333 2017-2018-2 《Java程序设计》第3周学习总结
- cocos2d-x解析xml时的Bug
- NServiceBus入门:启程(Introduction to NServiceBus: Getting started)
- 为什么fis没有freemarker的解决方案啊?_前端吧_百度贴吧
- 乐观锁悲观锁对应的JAVA代码和数据库