c++sizeof求类大小

Posted bitcarmanlee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++sizeof求类大小相关的知识,希望对你有一定的参考价值。

1.空类

空类的大小为1个字节,参看下面实例

class A ;

int main(int argc, char const *argv[])

    A a;
    cout<<"A sizeof is: "<<sizeof(a)<<endl;
    return 0;

代码输出结果为

A sizeof is: 1

为什么空类大小不为0?主要是为了确保两个不同对象地址不同,必须如此。

类的实例化是在内存中分配一块地址,每个实例在内存中都有一块不同地址。空类也会被实例化,所以编译器会给空类悄悄分配一字节,这样空类实例化以后就有了自己的地址。所以,空类的sizeof结果不能为0而是1。

2.包含虚函数的类

class B 
    public:
        virtual void func() 
        virtual void func2() 
        void func3() 
        static int n;
        int m;
        int *p;
;

int main(int argc, char const *argv[])

    B b;
    cout<<"B sizeof is: "<<sizeof(B)<<endl;
    return 0;

上面代码输出为:

B sizeof is: 24

我们分析一下这个24结果是如何得到的:
1.在类中,虚函数本身不占用类对象存储空间。
2.非静态函数,静态函数,都不占用类对象存储空间。
3.静态成员变量不占用类对象存储空间。
4.如果有虚函数,不管虚函数有多少个,只有一个虚指针vptr。

在类B中:
func, func2两虚函数,占用8个字节(64位系统)
func3不占用类空间
n是静态成员变量,也不占用类空间。
指针p占用8个字节
m是整形,本身4个字节。因为要进行内存对齐,所有需要8个字节。
因此,最终占用内存为:8+8+8=24。

3.派生类的大小

class C : public B 
    int nn;
    char cc;
    virtual void fn() 

;

int main(int argc, char const *argv[])

    cout<<"C sizeof is: "<<sizeof(C)<<endl;
    return 0;

类C继承上面的类B,最后代码运行的结果为

C sizeof is: 32

我们分析一下32怎么来的:
1.普通继承,派生类继承了所有基类的函数与成员,并且按照字节对齐来计算类的大小。
2.虚函数继承,不管如何继承,都继承了基类的vptr。

B类大小是24,C类中虚函数fn继承虚类的vptr,不占用额外空间。int nn占用4个字节,char cc占用1个字节,内存对齐以后,nn与cc占用总共8字节,所以C类总大小为24+8=32。

以上是关于c++sizeof求类大小的主要内容,如果未能解决你的问题,请参考以下文章

c ++中的sizeof显示字符串大小减一

求类中创建对象的个数

C 语言数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )

c strlen和sizeof详解

C语言中“SIZEOF(INT)“是啥意思?有啥作用?

c语言里:sizeof怎样用法?