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 语言数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )