字节大小

首先看一个例子:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A{};
 5 
 6 class B
 7 {
 8     int b;
 9     char c;
10 };
11 
12 class C
13 {
14     int c1;    
15     static int c2;
16 };
17 int C::c2 = 1;
18 
19 class D:public C,public B{
20     int d;
21 }; 
22 int main()
23 {
24     cout<<"sizeof(A)="<<sizeof(A)<<endl;
25     cout<<"sizeof(B)="<<sizeof(B)<<endl;
26     cout<<"sizeof(C)="<<sizeof(C)<<endl;
27     cout<<"sizeof(D)="<<sizeof(D)<<endl;
28 
29     return 0;
30 }

运行结果为:

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.

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

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

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7     void virtual aa(){};
 8 };
 9 
10 class B:public A
11 {
12     void virtual bb(){};
13 };
14 
15 class C:virtual A
16 {
17 public:
18     void virtual aa(){};
19     void cc(){};
20 };
21 
22 class D:virtual A
23 {
24 public:
25     void virtual dd(){};
26 };
27 
28 int main()
29 {
30     cout<<"sizeof(A)="<<sizeof(A)<<endl;
31     cout<<"sizeof(B)="<<sizeof(B)<<endl;
32     cout<<"sizeof(C)="<<sizeof(C)<<endl;
33     cout<<"sizeof(D)="<<sizeof(D)<<endl;
34 
35     return 0;
36 }

运行结果为:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

【每日一题】问题 1195: 去掉双斜杠注释

输入数据中含有一些符合C++语法的代码行(每行代码不超过200个字符)。需要说明的是,为了方便编程,规定双斜杠注释内容不含有双引号,源程序中没空行。

9720
来自专栏星回的实验室

js重修课[三]:对象

这一章相对来说是部重头戏,看完之后才发现用了这么久的js,却很少有用真正OO的思想在写js代码……

16240
来自专栏阮一峰的网络日志

Javascript的this用法

this是Javascript语言的一个关键字。 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,   function test(){ ...

281100
来自专栏C语言及其他语言

【编程经验】变量的存储类型

在 C 语言中,变量是对程序中数据所占内存空间的一种抽象定义,定义变量时,用户定义变量的名、 变量的类型,这些都是变量的操作属性。不仅可以通过变量名访问该变量,...

11230
来自专栏python成长之路

函数注意事项

15950
来自专栏GreenLeaves

Jquery 遍历数组之grep()方法介绍

grep()方法用于数组元素过滤筛选。 grep(array,callback,boolean);方法参数介绍。 array   ---待处理数组 callba...

20150
来自专栏Hongten

python开发_python中str.format()

20820
来自专栏C语言及其他语言

【每日一题】问题 1195: 去掉双斜杠注释

题目描述 将C程序代码中的双斜杠注释去掉。 输入 输入数据中含有一些符合C++语法的代码行(每行代码不超过200个字符)。需要说明的是,...

32090
来自专栏marsggbo

C++学习笔记之模板篇

一、模板 不管是函数模板还是类模板,在未初始化前都是不占用内存的。 另外一般来说模板代码不能分开编译,即不能分开写成.h文件和.c文件,需要写成一个文件。 ...

22380
来自专栏Java学习网

Java多态的实现有哪些要求?实现多态的关键技术有哪些?

多态指的是允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。实现多态的方法是动态绑定( D...

14820

扫码关注云+社区

领取腾讯云代金券