C++中类所占内存空间大小
2015-12-21 16:18
351 查看
学习虚继承知识的时候,无意中发现了关于C++类所需内存的面试题,通过sizeof()计算类所需的内存字节数。当时自己就懵了,
因为学习C++的时候,就知道类在声明时是不会分配内存空间的还以为自己学习的东西出错,还来才知道sizeof()作用:sizeof是
C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。是提前预计类所需要的内存空间。
接下来进行类不同情况,sizeof()的分析
原因:c++要求每个实例在内存中都有独一无二的地址。空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。
各个数据类型的所占内存大小
原因:C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节。无论多少个虚函数,只有这
一个指针,4字节。
data4继承data3的时候分了几种情况讨论:
1 data3类(包含virtual),data4(不包含virtual)直接继承data3 输出为12 ;
C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节。无论多少个虚函数,只有这一个指
针,4字节。并且子类的大小是本身成员变量的大小加上父类的大小。 父类12 子类0
若data4(不包含virtual)虚继承data3 输出为16
父类12加上子类的virtual(4) 16
2 data3类(包含virtual),data4(包含virtual)直接继承data3 输出为12
父类12,子类0,原因:如果子类直接继承父类,他们是共享一个虚函数指针
若是data4(包含virtual)虚继承data3,输出为16
父类12,子类虚函数指针4
输出16
3 data3类(不包含virtual),data4(包含virtual)直接继承 输出为12 若data4(不包含virtual)输出为8
父类为8 子类虚函数指针4 输出为12 父类8 子类0 输出8
data4(包含virtual)虚继承输出为 12 data4(不包含virtual)
输出为12
父类8 子类虚函数指针4 输出12,并且多个虚函数 只用一个指针
以上过程 大家可以直接建立一个控制台程序,进行实验
总结:
1 如果有多个virtual函数,只有一个指针(4个字节)
2 子类直接继承父类,若父中由virtual,则父子共享一个指针用来指定虚函数的虚拟函数表的入口地址。
3 若子类虚继承,则子类有自己的一个虚函数指针
因为学习C++的时候,就知道类在声明时是不会分配内存空间的还以为自己学习的东西出错,还来才知道sizeof()作用:sizeof是
C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。是提前预计类所需要的内存空间。
接下来进行类不同情况,sizeof()的分析
class kong{
};
cout << sizeof(kong)<<endl; //1 空类大小为1
原因:c++要求每个实例在内存中都有独一无二的地址。空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。
class data2{
int a;
char s;
};
cout << sizeof(data2)<<endl; //8 包含了对齐
各个数据类型的所占内存大小
class data3{
int a;
char s;
virtual void kong();
virtual void kong1();
};
cout << sizeof(data3)<<endl; //无virtual 8 有virtual 12 多个virtual 仍为 12
原因:C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节。无论多少个虚函数,只有这
一个指针,4字节。
class data4:public data3
{
virtual void kong2();
// virtual void kong3();
};
cout << sizeof(data4)<<endl;
data4继承data3的时候分了几种情况讨论:
1 data3类(包含virtual),data4(不包含virtual)直接继承data3 输出为12 ;
C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节。无论多少个虚函数,只有这一个指
针,4字节。并且子类的大小是本身成员变量的大小加上父类的大小。 父类12 子类0
若data4(不包含virtual)虚继承data3 输出为16
父类12加上子类的virtual(4) 16
2 data3类(包含virtual),data4(包含virtual)直接继承data3 输出为12
父类12,子类0,原因:如果子类直接继承父类,他们是共享一个虚函数指针
若是data4(包含virtual)虚继承data3,输出为16
父类12,子类虚函数指针4
输出16
3 data3类(不包含virtual),data4(包含virtual)直接继承 输出为12 若data4(不包含virtual)输出为8
父类为8 子类虚函数指针4 输出为12 父类8 子类0 输出8
data4(包含virtual)虚继承输出为 12 data4(不包含virtual)
输出为12
父类8 子类虚函数指针4 输出12,并且多个虚函数 只用一个指针
以上过程 大家可以直接建立一个控制台程序,进行实验
总结:
1 如果有多个virtual函数,只有一个指针(4个字节)
2 子类直接继承父类,若父中由virtual,则父子共享一个指针用来指定虚函数的虚拟函数表的入口地址。
3 若子类虚继承,则子类有自己的一个虚函数指针
相关文章推荐
- C++ Primer 学习笔记15 容器的选择
- C++设计模式新解四 观察者模式+事件订阅
- 插入排序的简单解释(C++)
- c++函数传参的一些指导原则
- C++关联容器-map[ ]=与insert操作不同
- Jni 学习之Java调用C++
- C++ CCF真题----画图
- 策略模式--c++实现
- C++的MFC项目弹窗方法使用
- C++primer plus第六版课后编程练习答案14.1
- c++多态之继承3-派生类的构造次序
- C++空类默认函数(编译器处理)
- C++项目VS项目目录结构简单说明
- C语言中定义变量(储存区 栈)和用malloc(动态分配 堆)的区别
- C语言--汇总
- C语言实现用星号在屏幕上打印菱形
- C语言函数不能返回局部变量的地址
- Leetcode 2 - Add Two Numbers
- Leetcode 1 - Two Sum
- C++11 gcc升级到5.2.0后报错:/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.17' not found