C++类的实例化对象的大小之sizeof()
来源:互联网 发布:只用身份证的贷款软件 编辑:程序博客网 时间:2024/05/14 15:16
之所以写这篇《C++类的实例化对象的大小之sizeof()》,是因为在参加笔试的时候遇到如下这么一道题,当时感觉就是这个一个坑,但,我还是义无反顾的跳了下去,因为存在知识点盲区啊。现,总结一下,你不知道的C++类的实例化对象的大小之sizeof()。
class D{public:D(){}virtual ~D(){}private:int a ;char *p;};
实例一:
class A{};A a;cout << sizeof(a) << endl;运行结果:1
解释:空类,没有任何成员变量或函数,即没有任何存储内容;但是由A a可知,空类仍然可以实例化。一个类能够实例化,编译器就需给它分配内存空间,来指示类实例的地址。这里编译器默认分配了一个字节,以便标记可能初始化的类实例,同时使空类占用的空间最少(即1字节)。
实例二:
class B{private:int a;};B b;cout << sizeof(b) << endl;运行结果:4
解释:当类中有其它成员占据空间时,那一个字节就不算在内了,如本题:结果是4,而不是1+4=5。
实例三:
class BB{private:int a ;char b;};BB bb;cout << sizeof(bb) << endl;运行结果:8
解释:什么?怎么会是8?不应该是4 + 1 = 5吗?这里考察了对齐,涉及到编译器的优化。对于大多数CPU来说,CPU字长的整数倍操作起来更快,因此对于这些成员加起来不够这个整数倍,有可能编译器会插入多余的内容凑足这个整数倍;此外,有时候相邻的成员之间也有可能因为这个目的被插入空白,这个叫做“补齐”(padding)。所以,C++标准紧紧规定成员的排列按照类定义的顺序,但是不要求在存储器中是紧密排列的。因此,如上的一个字节的char在存储时被补全了,成为了4个字节。
实例四:
class C{private:int a ;char *p;};C c;cout << sizeof(c) << endl;运行结果:8
解释:一般情况下,如果是指针,则无论指针指向的是什么数据类型,都占4个字节的存储空间。
实例五:
class D{public:D(){}virtual ~D(){}private:int a ;char *p;};D d;cout << sizeof(d) << endl;运行结果:12
解释:考察虚函数。当类含有虚函数时,(不论是自己的虚函数,还是继承来的),那么类中就有一个成员变量信息:虚函数指针(4个字节),这个指针指向一个虚函数表,虚函数表的第一项是类的typeinfo信息,之后的项为此类的所有虚函数的地址。
更进一步的解释:当类中有虚函数的时候,编译器会为类插入一个我们看不及爱你的数据并建立一个表。这个表就是虚函数表,那个我们看不见的数据就是指向虚函数表的指针——虚表指针。虚函数表就是为了保存类中的虚函数的地址。我们可以把虚函数表理解成一个数组,数组中的每个元素存放的就是类中虚函数的地址。当调用虚函数的时候,程序不是像普通函数那样直接跳到函数的代码处,而是先取出虚表指针即得到虚函数表的地址,根据这个来到虚函数表里,从这个表理取出该函数的指针,最后调用该函数。
实例六:
class E{public:E(){}virtual ~E(){}private:int a ;char *p;static int b;};E e;cout << sizeof(e) << endl;运行结果:12
解释:考察静态成员变量的内存分配。由于静态成员变量是在静态存储区分配空间的,它不属于实例的一部分,因此类中的static成员变量不占据空间。
实例七:
class F:public E{public:F(){}~F(){}private:int c;};E e;cout << sizeof(e) << endl;运行结果:16
解释:派生类对象的存储空间 = 基类存储空间 + 派生类特有的非static数据成员的空间
实例八:
class G: public virtual E{public:G(){}~G(){}private:int c;};G g;cout << sizeof(g) << endl;运行结果:20
解释:如果是虚继承的话,类对象的存储空间大小 = 基类的存储空间 + 派生类特有的非static数据成员的存储空间 + 每一个类的虚函数存储空间(这个是额外加的,即按照这个公式,sizeof(g) = 12(E基类的存储空间) + 4(G特有的非static数据成员的存储空间) + 4(E类的虚函数的存储空间,如果E类中有多个虚函数,只算一次))。
实例九:
class H: public virtual E{public:H(){}~H(){}virtual void GetValue(){}private:int c;};H h;cout << sizeof(h) << endl;运行结果:24
解释:对比实例八,按照上面的解释:类对象的存储空间大小 = 基类的存储空间 + 派生类特有的非static数据成员的存储空间 + 每一个类的虚函数存储空间(sizeof(h) = 12(E基类的存储空间) + 4(G特有的非static数据成员的存储空间) + 4(E类的虚函数的存储空间,如果E类中有多个虚函数,只算一次)+ 4(H类的虚函数的存储空间,如果H类中有多个虚函数,只算一次))。
如上,就是我对于这种类型的总结,这种问题只能出现一次!!!
加油,放平心态。念念不忘,必有回响!!!
- C++类的实例化对象的大小之sizeof()
- C++类的实例化对象的大小之sizeof()
- sizeof 计算类的实例化大小
- 类对象的sizeof大小
- C++:类的大小(sizeof)
- 对象的大小(sizeof)
- sizeof Class类的对象的大小
- 类对象大小的 sizeof 计算问题
- 转载 Java中类C/C++的sizeof()操作,知晓实例大小
- 转载 Java中类C/C++的sizeof()操作,知晓实例大小
- 类的sizeof大小
- 类的大小(sizeof)
- sizeof(类)的大小
- 实例化对象的大小
- 类的大小 (sizeof(类对象))的计算方法
- 关于类对象大小的 sizeof 计算问题
- 关于类对象大小的 sizeof 计算问题(续)
- 关于类对象大小的 sizeof 计算问题
- HTML <a> 标签的 target 属性
- spring mvc 静态资源 404问题
- js 函数简单封装
- Ubuntu kylin下的一些基础配置
- 【UVA】11468-Substring(AC自动机)
- C++类的实例化对象的大小之sizeof()
- 内部类,静态内部类
- LCA转RMQ模板
- JAVA猜数字1到100游戏
- slime 使用手册
- Unity3D中Javascript的基本使用与介绍详解
- 工作周记
- 2014.10.15 通过PMP考试
- LeetCode-Reverse Words in a String