c++:空类及其子类的占用空间问题

本文探讨了C++中空的struct/class、继承空类的子类以及继承空类的空子类在内存中占用的空间大小。空类通常占1个字节以确保唯一地址,而继承空类的子类如果包含成员变量,则不再额外占用空间。对于继承空类的空子类,仍占1个字节。这些规则确保了对象实例化的正确性和内存管理的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、空的struct/class占多大空间,为什么占这么多?

2、继承空类的子类占用多大空间?

3、继承空类的空子类占用多大空间呢?


1、空的struct/class占多大空间,为什么占这么多?

/*================================================================
*   Copyright (C) 2021 baichao All rights reserved.
*
*   文件名称:emptyClassSize.cpp
*   创 建 者:baichao
*   创建日期:2021年02月03日
*   描    述:
*
================================================================*/

#include <iostream>

struct base1{};
class base2{};

int main()
{
    std::cout<<"类base1的长度为:"<<sizeof(base1)<<std::endl;
    std::cout<<"结构体base2的长度为:"<<sizeof(base2)<<std::endl;
    return 0;
}

运行结果:

空类或者空结构体占1个字节,因为c++要求每个实例在内存中都有独一无二的地址。空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。

2、继承空类的子类占用多大空间?

/*================================================================
*   Copyright (C) 2021 baichao All rights reserved.
*
*   文件名称:emptyClassSize.cpp
*   创 建 者:baichao
*   创建日期:2021年02月03日
*   描    述:
*
================================================================*/

#include <iostream>

struct base1{};
class base2{};

class rbase2:public base2
{
    int a;
};

int main()
{
    std::cout<<"结构体base1的长度为:"<<sizeof(base1)<<std::endl;
    std::cout<<"类base2的长度为:"<<sizeof(base2)<<std::endl;
    std::cout<<"类rbase2的长度为:"<<sizeof(rbase2)<<std::endl;
    return 0;
}

运行结果:

继承空类的子类所占空间仅不再包含空类单独存在时所占用的一个字节,因为子类已经有成员变量了。

3、继承空类的空子类占用多大空间呢?

/*================================================================
*   Copyright (C) 2021 baichao All rights reserved.
*
*   文件名称:emptyClassSize.cpp
*   创 建 者:baichao
*   创建日期:2021年02月03日
*   描    述:
*
================================================================*/

#include <iostream>

struct base1{};
class base2{};

class rbase2:public base2
{
    int a;
};

class rbase3:public base2
{
};
int main()
{
    std::cout<<"结构体base1的长度为:"<<sizeof(base1)<<std::endl;
    std::cout<<"类base2的长度为:"<<sizeof(base2)<<std::endl;
    std::cout<<"类rbase2的长度为:"<<sizeof(rbase2)<<std::endl;
    std::cout<<"空子类rbase3的长度为:"<<sizeof(rbase3)<<std::endl;
    return 0;
}

运行结果:

继承空类的空子类依然只有一个字节。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值