C++中一个class类对象占用多少内字节(7个例子,很清楚)
一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分?
一个Class对象需要占用多大的内存空间。最权威的结论是:
*非静态成员变量总合。
*加上编译器为了CPU计算,作出的数据对齐处理。
*加上为了支持虚函数,产生的额外负担。
介绍完了理论知识后,再看看再找一个例子看看(注:一下所有结果都是在VC6.0 开发环境中得出的结论)
一、空类的Size
1 class Car 2 { 3 }; 4 5 void main() 6 { 7 int size = 0; 8 Car objCar; 9 size = sizeof(objCar); 10 printf("%s %d /r", "Class Car Size:", size); 11 }
输出结果:Class Car Size:1
这是为何呢?我想对于这个问题,不仅是刚入行不久的开发新手,就算有过几年以上C++开发经验的开发人员也未必能说清楚这个。
编译器在执行Car objCar;这行代码后需要,作出一个Class Car的Object。并且这个Object的地址还是独一无二的,于是编译器就会给空类创建一个隐含的一个字节的空间。
二、只有成员变量的Size
1 class Car 2 { 3 private: 4 int nLength; 5 int nWidth; 6 }; 7 8 void main() 9 { 10 int size = 0; 11 Car objCar; 12 size = sizeof(objCar); 13 printf("%s %d /r", "Class Car Size:", size); 14 }
输出结果:Class Car Size:8
这个结果很多开发人员都清楚。在32位系统中,整型变量占4个字节。这里Class Car中含有两个整型类型的成员变量,所以Class Size是8。
三、有静态成员变量的Size
1 class Car 2 { 3 private: 4 int nLength; 5 int nWidth; 6 static int sHigh; 7 }; 8 9 void main() 10 { 11 int size = 0; 12 Car objCar; 13 size = sizeof(objCar); 14 printf("%s %d /r", "Class Car Size:", size); 15 }
输出结果:Class Car Size:8
我们这次在Class Car中添加了一个静态成员变量,但是Class Size仍然是8个字节。这正好符合了,结论中的第一条:非静态成员变量总合。
四、有字符型变量(char)的Size
1 class Car 2 { 3 private: 4 char chLogo 5 int nLength; 6 int nWidth; 7 static int sHigh; 8 }; 9 10 void main() 11 { 12 int size = 0; 13 Car objCar; 14 size = sizeof(objCar); 15 printf("%s %d /r", "Class Car Size:", size); 16 }
输出结果:Class Car Size:12
在类中又插入了一个字符型变量,结果Class Size变成了12。这个就是编译器额外添加3个字符变量,做数据对齐处理,为了是提高CPU的计算速度。编译器额外添加的东西我们是无法看见的。这也符合了结论中的第二条:加上编译器为了CPU计算,作出的数据对齐处理。
既然,我们这样定义类成员数据编译器会额外的增加空。那么,我们何不在定义类的时候就考虑到数据对齐的问题,可以多定义出3个字符类型变量作为预留变量,既能满足数据对齐的要求,也给自己的程序添加了一些可扩展的空间。
五、只有成员函数的Size
1 class Car 2 { 3 public: 4 Car(){}; 5 ~Car(){}; 6 public: 7 void Fun(){}; 8 }; 9 10 void main() 11 { 12 int size = 0; 13 Car objCar; 14 size = sizeof(objCar); 15 printf("%s %d /r", "Class Car Size:", size); 16 }
输出结果:Class Car Size:1
噢,这是怎么回事儿呢?再做一个实验看看。
六、有成员函数和成员变量的Size
1 class Car 2 { 3 public: 4 Car(){}; 5 ~Car(){}; 6 public: 7 void Fun(){}; 8 private: 9 int nLength; 10 int nWidth; 11 }; 12 13 void main() 14 { 15 int size = 0; 16 Car objCar; 17 size = sizeof(objCar); 18 printf("%s %d /r", "Class Car Size:", size); 19 }
输出结果:Class Car Size:8
这次应该很清楚的了。函数是不占用类空间的。第一个例子中的Size为1个字节,正是编译器为类创建一个隐含的一个字节的空间
七、有虚函数(virtual)的Size
1 class Car 2 { 3 public: 4 Car(){}; 5 virtual ~Car(){}; 6 public: 7 void Fun(){}; 8 }; 9 10 void main() 11 { 12 int size = 0; 13 Car objCar; 14 size = sizeof(objCar); 15 printf("%s %d /r", "Class Car Size:", size); 16 }
输出结果:Class Car Size:4
这次,让析构函数为虚函数,看到了Class Size为4。这正是指向Virtual Table的指针vptr的Size。这正好符合了,结论中的第三条:加上为了支持虚函数,产生的额外负担。
http://www.cnblogs.com/findumars/p/7270628.html
转载于:https://www.cnblogs.com/georgeOfChina/p/7661698.html
C++中一个class类对象占用多少内字节(7个例子,很清楚)相关推荐
- 在c++中一个空类占用的字节数
结论: 在c++中一个空类占用:1Byte. 有的同学认为一个空类占0Byte,那么定义一个空类时,他存放到哪里呢?为此,在c++编译器中,为空类设置了占用1Byte内存. #include < ...
- 创建一个长方形类,成员域有长方形的长和宽,成员方法有计算长方形的面积,在main方法中创建长方形类对象,并调用计算长方形面积的方法。
package TestDemo; /** 创建一个长方形类,成员域有长方形的长和宽,成员方法有计算长方形的面积.* 在main方法中创建长方形类对象,并调用计算长方形面积的方法.*/ import ...
- 【MATLAB统计分析与应用100例】案例009:创建一个RandStream类对象,调用其randn方法生成标准正态分布随机数
文章目录 1. 创建一个RandStream类对象s,其随机数生成器的算法为'mlfg6331_64',初始种子为10 2. 调用对象s的randn方法生成10行10列的随机数矩阵x,其元素服从标准正 ...
- php 继承内核中的基类,继承类上的PHP new self()正在创建一个基类对象
参见英文答案 > New self vs. new static 3个 我有一个充当基类的类.然后我有几个继承它的类.我想开 ...
- C++对象模型探索 / 普通类对象占用的空间
一.空类的大小 #include <iostream>class A{};int main() {A obja;std::cout << "obja 的地址:&quo ...
- python 对象创建_从Python中的基类对象创建对象
我有一个基类:class Animal(object): def __init__(self, name=None, food=None): self.name = name self.food = ...
- Qt中一个.cpp类的函数调用另一个.cpp中类的函数的方法
Qt 下面经常会用到一个函数调用的时候会调用到另一个函数,如果这两个函数在两个.cpp文件中,那么应该怎么调用呢? 假设在B类点击一个按钮会调用A类的一个函数,实际上只需要: 一. 在B的构造函数中c ...
- 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)
ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...
- 学习【菜鸟教程】【C++ 类 对象】【内联函数】(例子简单,评论难懂)
文章目录 1. 教程 2. 千赞评论 3. 百赞评论 1. 教程 链接 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. ...
最新文章
- Blender中的Python脚本介绍学习教程
- Android P 电量管理,Android P亮点汇总:更智能 更简单
- (转)Javascript模块化编程(一):模块的写法
- SimpleDateFormat线程不安全
- python 代码-你见过哪些令你瞠目结舌的 Python 代码技巧?
- python编写一个软件-软件代做:利用Python编写一个行业专用的小计算器
- J2EE (六) 详解 java 中文乱码
- 手工安装kubernetes
- 【Little_things】jsp+MySql简单的数据录入功能
- kafka部分重要参数配置-broker端参数
- php filespl,PHP SPL--遍历目录
- G1垃圾收集器之SATB
- 解决下载GitHub项目速度慢的问题(2019.1.21亲测有效)
- 我的世界服务器修改世界难度,我的世界服务器空岛生存调难度指令 | 手游网游页游攻略大全...
- 联想微型计算机v1.0,联想Energy Management
- 安卓监听是否有闹钟设置
- 【vscode简单入门(四)】vscode精美UI主题推荐 (~」还你一个花里胡哨的vscode「~)
- 别被别人抢走了你的时间
- android关闭听筒模式,Android开发【06-29视频贴】切换听筒模式部分手机失效,怎么解决?...
- [HAOI2012]外星人——数论欧拉函数
热门文章
- “AS3.0高级动画编程”学习:第二章转向行为(上)
- pat 食物链(状态压缩求哈密顿回路)
- android 自定义loading,Android自定义动画-StarLoadingView
- linux parted rpm,为Everest Linux构建QtParted的rpm包(四)
- cmake java_JNI系列之AS支持CMake了
- java项目怎样强制删除手机缓存_Myeclipse清理项目缓存的几大方法
- C/C++ 读取任意数目的整数
- mysql查询动态表名的数据类型_Mysql中查询某个数据库中所有表的字段信息
- animation动画不生效_关于CSS3的animation使用的一些坑,需要注意下!
- Java对点、线、面生成栅格瓦片jpg,并渲染呈现