当前位置:首页 > 数码 > 揭秘空类的妙用和陷阱-C-空类的真面目 (空类是什么意思)

揭秘空类的妙用和陷阱-C-空类的真面目 (空类是什么意思)

admin7个月前 (05-14)数码29

什么是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

蠡县德茂花炮还开着呢吗

蠡县德茂花炮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、元素晶核

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: C

“揭秘空类的妙用和陷阱-C-空类的真面目 (空类是什么意思)” 的相关文章

深化剖析-atomic-代码范例和实践运行-std-现代-中的原子-C (深化剖析整改)

深化剖析-atomic-代码范例和实践运行-std-现代-中的原子-C (深化剖析整改)

一、引言 在并发编程中,原子操作是一种无法终止的操作,即在多线程环境中,一旦开局就不会被其余线程搅扰。C++11引入了std::atomic库以支持原子操作,为并发编程提供了更为方便和高效的...

揭秘性能与并发的机密-C-多线程编程 (性能与什么有关)

揭秘性能与并发的机密-C-多线程编程 (性能与什么有关)

当天咱们将深化讨论C++中的多线程编程,提醒多线程如何解锁性能后劲,提高程序的并发性能。 什么是多线程? 在计算机迷信中,多线程是指一个进程(程序的口头实例)中的多个线程同时口头。每个...

开源项目-助初学者进阶成长-C-八个 (开源项目有什么用)

开源项目-助初学者进阶成长-C-八个 (开源项目有什么用)

通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。 ThreadPool 一个简单...

了解圈套和无效经常使用技巧-言语变长参数-C (了解圈套和无线的区别)

了解圈套和无效经常使用技巧-言语变长参数-C (了解圈套和无线的区别)

C工具 变长参数列表 这局部解释了旧的C格调变长参数列表。了解这些内容很关键,由于你或许会在遗留代码中遇到它们。但是,在新代码中,你应该经常使用变参模板来成功类型安保的变长参数列表。...

的区别-中-C-math.h-和-cmath (的区别中的钱)

的区别-中-C-math.h-和-cmath (的区别中的钱)

一、引言 C++规范库中的<cmath>和C言语规范库中的<math.h>均为数学函数库,它们提供了一系列数学函数和常量。但是,这两者之间存在一些关键的区别...

监禁程序后劲的优化利器-C-中的内联函数 (监禁等于坐牢吗)

监禁程序后劲的优化利器-C-中的内联函数 (监禁等于坐牢吗)

一、内联函数的定义和特点 内联函数是一种不凡的函数,它经过在编译时将函数调用交流为函数体中的代码,以缩小函数调用的开支,从而提高程序的口头效率。内联函数通罕用于那些函数体较小、调用频繁的场景...

与设计形式-可裁减的代码-C-打造可保养 (设计与形式的关系)

与设计形式-可裁减的代码-C-打造可保养 (设计与形式的关系)

引言 C++是一种弱小的编程言语,它提供了许多工具和库以支持面向对象编程和通用编程。设计形式是一种用于处置特定疑问的经过验证的处置打算。C++的灵敏性和设计形式的广泛...

提升性能和效率的全面指南-C-代码优化攻略 (提升性能和效率的英文)

提升性能和效率的全面指南-C-代码优化攻略 (提升性能和效率的英文)

对象池模式是一种设计模式,用于管理特定类型的对象。它在构造函数中预先分配了一定数量的对象,并在需要时从中获取对象,使用完毕后再将对象归还给对象池。这样可以减少频繁的动态内存分配和释放,提高性能。...