揭秘空类的妙用和陷阱-C-空类的真面目 (空类是什么意思)
什么是C++的空类
望文生义,空类就是指哪些不蕴含成员变量的类。例如以下这个就是一个空类:
classEmptyBase{};
既然如此,那么是不是说空类的外部肯定不会其余代码呢?不是的,空类外部也可以蕴含其余物品,例如:结构函数、析构函数、静态成员变量、静态函数、成员函数、typedef语句等。
例如在以下代码中EmptyBase依然是空类:
classEmptyBase{public://结构函数EmptyBase(){}//析构函数~EmptyBase(){}//typedef并没有给类参与成员或许函数typedefintINT_NUM;//不触及到外部成员变量的外部函数voidset(inta){}//静态函数staticvoidsetStr(conststd::string&s){}//静态变量staticstd::stringstr;};
在C++11之后咱们可以经常使用std::is_empty判别一个类能否是空类:
#include<tream>classEmptyBase{};intmn(){autoaa=std::is_empty<EmptyBase>::value;std::cout<<"能否是空类:"<<aa<<std::endl;return0;}
C++空类的大小
有以下计算空类大小的代码,你以为输入结果是多少?
#include<iostream>classEmptyClass{//空类};intmain(intargc,char*argv[]){std::cout<<"sizeof(EmptyClass):"<<sizeof(EmptyClass)<<std::endl;return0;}
即使是空类,其大小也不会为0。在许多平台上,空类的大小为1;而在某些关于对齐(alignment)要求更严厉系统上,空类的大小或许是另一个数(通常是4)。
为什么C++空类的大小不是0呢?
C++的设计者们不准许类的大小为0,由于每个对象都肯定具备惟一的地址,特意是在触及到取址和指针计算时,假设一个类的大小是0,那么指针的一切将会失效。试想一下假设空类的大小为0,那么由空类它们造成的数组,其大小肯定也是0,这会造成指针运算中广泛经常使用的性质失效。
空基类优化
C++规范规则,当空类作为基类时,只需不会与同一类型的另一个对象或子对象调配在同一地址,就不需为其调配任何空间。
#include<iostream>classEmptyBase{//空基类};classEmptyOne:publicEmptyBase{//空类1};classEmptyTwo:publicEmptyOne{//空类2};intmain(intargc,char*argv[]){std::cout<<"sizeof(EmptyBase):"<<sizeof(EmptyBase)<<std::endl;std::cout<<"sizeof(EmptyOne):"<<sizeof(EmptyOne)<<std::endl;std::cout<<"sizeof(EmptyTwo):"<<sizeof(EmptyTwo)<<std::endl;return0;}
假设编译器支持空基类优化,上述程序一切的输入结果相反(普通是1),但均不为0。
咱们修正一下代码,将EmptyTwo改为多承袭,那么EmptyTwo还是空类吗?
classEmptyTwo:publicEmptyOne,publicEmptyBase{};
答案是在多承袭形态的EmptyTwo曾经不是空类了,虽然EmptyTwo和它的基类都没有任何成员。不过,EmptyTwo的基类EmptyOne和EmptyBase不能调配到同一地址空间,否则EmptyTwo的基类EmptyBase会和EmptyOne的基类EmptyBase撞在同一地址空间上。换句话说,两个相反类型的子对象偏移量相反,这是C++对象规划规则不准许的。
对空基类优化启动限度的基本要素在于,咱们须要能比拟两个指针能否指向同一对象。由于指针简直总是用地址作外部示意,所以咱们肯定保障两个不同的地址(即两个不同的指针值)对应两个不同的对象。虽然这种解放看起来并不十分关键,但是在实践运行中的许多类都是承袭自一组定义公共typedefs的基类,当这些类作为子对象出如今同一对象中时,疑问就凸现进去了,此时优化应被制止。
空类存在的意义是什么
虽然在面向对象编程中,空类看起来或许有些多余,但是它们存确有它们的用途。
空类是一种有着潜在运行价值的编程技巧,例如空类可以被用于多种编程形式和设计形式中,它还可以作为数据类型的标志,用于在编译时成功条件编译。空类也可以作为接口占位符,用于后续的承袭成功或许后续裁减等。空类也在模板编程和元编程等初级编程技术中也施展关键作用。
例如在C++规范库中,五种迭代器类别都有对应的空类。这些空类用于标识迭代器的类别,并经过模板特化来成功对不同类型迭代器的不凡处置,如图:
![C](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
蠡县德茂花炮还开着呢吗
蠡县德茂花炮2022年11月16号还开着。 蠡县德茂花炮营业时间是早上八点到晚上六点半。 蠡县德茂花炮制造有限公司的经营范围是:升空类C级、引火线自用生产。 许可证有效期至2019年06月30日,依法须经批准的项目,经相关部门批准后方可开展经营活动。 在河北省,相近经营范围的公司总注册资本为2989万元,主要资本集中在100-1000万规模的企业中,共15家。 蠡县德茂花炮制造有限公司对外投资1家公司,具有0处分支机构。
剑与远征诗社竞答第6天答案是什么
剑与远征诗社竞答第6天答案是什么?在剑与远征的新活动中玩家们需要回答一些问题,那么这些问题的答案是什么呢?下面的这个文章就可以告诉大家剑与远征诗社竞答第6天答案,还没有做过的朋友赶紧看看吧。
剑与远征诗社竞答第6天答案攻略1、负誓守卫-塔尼在使用技能“循誓而击”时会瞬身至哪根罪表柱?
答案:B、距离自身最远
2、烁金翼狮是什么种类的猎场兽灵?
答案:C、翱空类
3、报丧冥妖-狄塞拉的专属装备的名称是?
答案:A、背信骨螺
4、撼山铁拳-奥库在使用技能“昆虫武装”时,会与几个甲虫伙伴一同进行攻击?
答案:D、2
5、以下哪个道具可以用于提升永生刻印等级?
答案:A、元素晶核
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。