首页 > 编程 > C++ > 正文

深入研究c++类的大小

2020-02-24 14:35:01
字体:
来源:转载
供稿:网友

这篇文章将带您深入研究c++类的大小问题,学习下来,你可能会发现这根本就是一门新的语言,想知道其中的内容详情,一起往下学习吧,你会有新的收获的。

首先看一个例子:

复制代码 代码如下:

#include
 using namespace std;

 class A{};

 class B
 {
     int b;
     char c;
 };

 class C++
 {
     int c1;   
     static int c2;
 };
 int C::c2 = 1;

 class D:public C,public B{
     int d;
 };
 int main()
 {
     cout<<"sizeof(A)="<     cout<<"sizeof(B)="<     cout<<"sizeof(C)="<     cout<<"sizeof(D)="<
     return 0;
 }
(d)
(c)
(b)
(a)


运行结果为:

 

sizeof(A)=1

sizeof(B)=8

sizeof(C)=4

sizeof(D)=16


对于类A来说,虽然A是一个空类,但为了便于空类进行实例化,编译器往往会给它分配一个字节,这样A实例化后便在内存中有了一个独一无二的地址.对于类B,B的大小应为sizeof(int)+sizeof(char)=5,但是考虑内存对齐,B的大小应为8.对于类C,类的静态成员变量被放在全局区,和类的普通成员并没有放在一块。类的静态成员被声明后就已存在,而非静态成员只有类被实例化后才存在。所以C的大小为sizeof(int)=4。D的大小为B+C的大小+自身数据成员的大小,一共为16.

 

==========================分割线在这里====================================

下面讨论含有虚函数的类的大小:

复制代码 代码如下:

#include
 using namespace std;

 class A
 {
 public:
     void virtual aa(){};
 };

 class B:public A
 {
     void virtual bb(){};
 };

 class C:virtual A
 {
 public:
     void virtual aa(){};
     void cc(){};
 };

 class D:virtual A
 {
 public:
     void virtual dd(){};
 };

 int main()
 {
     cout<<"sizeof(A)="<     cout<<"sizeof(B)="<     cout<<"sizeof(C)="<     cout<<"sizeof(D)="<
     return 0;
 }
(d)
(c)
(b)
(a)


运行结果为:

 

sizeof(A)=4

sizeof(B)=4

sizeof(C)=8

sizeof(D)=12

对于class A,它含有一个虚函数,编译器会为虚函数生成一张虚函数表,来记录对应的函数地址,为此,在class A的内存地址中要有一个vfptr_A指针指向这个虚表,所以class A的大小为指针大小,即4.(注意,无论类中有多少个虚函数,它们的大小都是4,因为内存中只需要保存这个指针即可)。

对于class B,它是public继承A,虽然它也有一个虚函数,但是从结果看,B应该和A都在B的vtable(虚表中),所以class B的大小为4.

对于class C,它是vitual 继承A,所以要有一个指向父类A的指针,占有4字节大小aa()是继承自class A的虚函数,从结果来看,它没有在内存中占有空间,所以C的大小为sizeof(A)+4=8.

对于class D,它是虚继承class A,同上,要有一个指向父类A的指针,同时,class D中有虚函数,所以要有一个指向虚表的指针,所以sizeof(D)=sizeof(A)+4+4=12

以上就是武林小编带来的深入研究c++类的大小,想必都已有了一定的了解,更多关于C++的内容请继续关注武林技术频道。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表