当前位置:首页 > 科技  > 软件

C++空类的那点事儿

来源: 责编: 时间:2023-12-04 17:26:27 345观看
导读什么是C++的空类顾名思义,空类就是指哪些不包含成员变量的类。例如以下这个就是一个空类:class EmptyBase {};既然如此,那么是不是说空类的内部一定不会其他代码呢?不是的,空类内部也可以包含其他东西,例如:构造函数、析构函

BXB28资讯网——每日最新资讯28at.com

什么是C++的空类

顾名思义,空类就是指哪些不包含成员变量的类。例如以下这个就是一个空类:BXB28资讯网——每日最新资讯28at.com

class EmptyBase {};

既然如此,那么是不是说空类的内部一定不会其他代码呢?不是的,空类内部也可以包含其他东西,例如:构造函数、析构函数、静态成员变量、静态函数、成员函数、typedef语句等。BXB28资讯网——每日最新资讯28at.com

例如在以下代码中EmptyBase依然是空类:BXB28资讯网——每日最新资讯28at.com

class EmptyBase {public:    // 构造函数    EmptyBase(){    }    // 析构函数    ~EmptyBase(){    }    // typedef并没有给类增加成员或者函数    typedef int INT_NUM;        // 不涉及到内部成员变量的内部函数    void set(int a){    }    // 静态函数    static void setStr(const std::string& s){    }    // 静态变量    static std::string str;};

在C++11之后我们可以使用std::is_empty判断一个类是否是空类:BXB28资讯网——每日最新资讯28at.com

#include <iostream>class EmptyBase {};int main() {        auto aa = std::is_empty<EmptyBase>::value;    std::cout << "是否是空类:" << aa << std::endl;    return 0;}

C++空类的大小

有以下计算空类大小的代码,你认为输出结果是多少?BXB28资讯网——每日最新资讯28at.com

#include <iostream>class EmptyClass {    // 空类};int main(int argc, char* argv[]) {    std::cout << "sizeof(EmptyClass): " << sizeof(EmptyClass) << std::endl;    return 0;}

即使是空类,其大小也不会为0。在许多平台上,空类的大小为1;而在某些对于对齐(alignment)要求更严格系统上,空类的大小可能是另一个数(通常是4)。BXB28资讯网——每日最新资讯28at.com

为什么C++空类的大小不是0呢?BXB28资讯网——每日最新资讯28at.com

C++的设计者们不允许类的大小为0,因为每个对象都必须具有唯一的地址,特别是在涉及到取址和指针计算时,如果一个类的大小是0,那么指针的一切将会失效。 试想一下如果空类的大小为0,那么由空类它们构成的数组,其大小必然也是0,这会导致指针运算中普遍使用的性质失效。BXB28资讯网——每日最新资讯28at.com

空基类优化

C++标准规定,当空类作为基类时,只要不会与同一类型的另一个对象或子对象分配在同一地址,就不需为其分配任何空间。BXB28资讯网——每日最新资讯28at.com

#include <iostream>class EmptyBase {    // 空基类};class EmptyOne: public EmptyBase{    // 空类1};class EmptyTwo: public EmptyOne{    // 空类2};int main(int argc, 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;    return 0;}

如果编译器支持空基类优化,上述程序所有的输出结果相同(一般是1),但均不为0。BXB28资讯网——每日最新资讯28at.com

我们修改一下代码,将EmptyTwo改为多继承,那么EmptyTwo还是空类吗?BXB28资讯网——每日最新资讯28at.com

class EmptyTwo: public EmptyOne,public EmptyBase{};

答案是在多继承状态的EmptyTwo已经不是空类了, 虽然EmptyTwo和它的基类都没有任何成员。不过,EmptyTwo的基类EmptyOne和EmptyBase不能分配到同一地址空间, 否则EmptyTwo的基类EmptyBase会和EmptyOne的基类EmptyBase撞在同一地址空间上。换句话说,两个相同类型的子对象偏移量相同,这是C++对象布局规则不允许的。BXB28资讯网——每日最新资讯28at.com

对空基类优化进行限制的根本原因在于,我们需要能比较两个指针是否指向同一对象。 由于指针几乎总是用地址作内部表示,所以我们必须保证两个不同的地址(即两个不同的指针值)对应两个不同的对象。 虽然这种约束看起来并不非常重要,但是在实际应用中的许多类都是继承自一组定义公共typedefs的基类,当这些类作为子对象出现在同一对象中时,问题就凸现出来了,此时优化应被禁止。BXB28资讯网——每日最新资讯28at.com

空类存在的意义是什么

尽管在面向对象编程中,空类看起来可能有些多余,但是它们存确有它们的用途。BXB28资讯网——每日最新资讯28at.com

空类是一种有着潜在应用价值的编程技巧,例如空类可以被用于多种编程模式和设计模式中,它还可以作为数据类型的标记,用于在编译时实现条件编译。 空类也可以作为接口占位符,用于后续的继承实现或者后续扩展等。空类也在模板编程和元编程等高级编程技术中也发挥重要作用。BXB28资讯网——每日最新资讯28at.com

例如在C++标准库中,五种迭代器类别都有对应的空类。这些空类用于标识迭代器的类别,并通过模板特化来实现对不同类型迭代器的特殊处理,如图:BXB28资讯网——每日最新资讯28at.com

BXB28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-37672-0.htmlC++空类的那点事儿

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 开发者必备的五类AI工具,不容错过!

下一篇: C++构造函数:初始化对象成员变量的关键

标签:
  • 热门焦点
  • 女孩租房开2小时空调用完100元电费引热议:5级能耗惹不起 月薪过万电费也交不起

    近日,江苏苏州一女孩租房当天充值了100元电费,开着空调不到2小时发现电费已用完。对于为什么这个快,房东表示,电表坏了这种情况很多,之前也遇到过,给租客换
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的&ldquo;在线鉴别&rdquo;,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
Top