一个空的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个例子,很清楚)相关推荐

  1. 在c++中一个空类占用的字节数

    结论:  在c++中一个空类占用:1Byte. 有的同学认为一个空类占0Byte,那么定义一个空类时,他存放到哪里呢?为此,在c++编译器中,为空类设置了占用1Byte内存. #include < ...

  2. 创建一个长方形类,成员域有长方形的长和宽,成员方法有计算长方形的面积,在main方法中创建长方形类对象,并调用计算长方形面积的方法。

    package TestDemo; /** 创建一个长方形类,成员域有长方形的长和宽,成员方法有计算长方形的面积.* 在main方法中创建长方形类对象,并调用计算长方形面积的方法.*/ import ...

  3. 【MATLAB统计分析与应用100例】案例009:创建一个RandStream类对象,调用其randn方法生成标准正态分布随机数

    文章目录 1. 创建一个RandStream类对象s,其随机数生成器的算法为'mlfg6331_64',初始种子为10 2. 调用对象s的randn方法生成10行10列的随机数矩阵x,其元素服从标准正 ...

  4. php 继承内核中的基类,继承类上的PHP new self()正在创建一个基类对象

    参见英文答案 > New self vs. new static                                    3个 我有一个充当基类的类.然后我有几个继承它的类.我想开 ...

  5. C++对象模型探索 / 普通类对象占用的空间

    一.空类的大小 #include <iostream>class A{};int main() {A obja;std::cout << "obja 的地址:&quo ...

  6. python 对象创建_从Python中的基类对象创建对象

    我有一个基类:class Animal(object): def __init__(self, name=None, food=None): self.name = name self.food = ...

  7. Qt中一个.cpp类的函数调用另一个.cpp中类的函数的方法

    Qt 下面经常会用到一个函数调用的时候会调用到另一个函数,如果这两个函数在两个.cpp文件中,那么应该怎么调用呢? 假设在B类点击一个按钮会调用A类的一个函数,实际上只需要: 一. 在B的构造函数中c ...

  8. 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)

    ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...

  9. 学习【菜鸟教程】【C++ 类 对象】【内联函数】(例子简单,评论难懂)

    文章目录 1. 教程 2. 千赞评论 3. 百赞评论 1. 教程 链接 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. ...

最新文章

  1. Blender中的Python脚本介绍学习教程
  2. Android P 电量管理,Android P亮点汇总:更智能 更简单
  3. (转)Javascript模块化编程(一):模块的写法
  4. SimpleDateFormat线程不安全
  5. python 代码-你见过哪些令你瞠目结舌的 Python 代码技巧?
  6. python编写一个软件-软件代做:利用Python编写一个行业专用的小计算器
  7. J2EE (六) 详解 java 中文乱码
  8. 手工安装kubernetes
  9. 【Little_things】jsp+MySql简单的数据录入功能
  10. kafka部分重要参数配置-broker端参数
  11. php filespl,PHP SPL--遍历目录
  12. G1垃圾收集器之SATB
  13. 解决下载GitHub项目速度慢的问题(2019.1.21亲测有效)
  14. 我的世界服务器修改世界难度,我的世界服务器空岛生存调难度指令 | 手游网游页游攻略大全...
  15. 联想微型计算机v1.0,联想Energy Management
  16. 安卓监听是否有闹钟设置
  17. 【vscode简单入门(四)】vscode精美UI主题推荐 (~」还你一个花里胡哨的vscode「~)
  18. 别被别人抢走了你的时间
  19. android关闭听筒模式,Android开发【06-29视频贴】切换听筒模式部分手机失效,怎么解决?...
  20. [HAOI2012]外星人——数论欧拉函数

热门文章

  1. “AS3.0高级动画编程”学习:第二章转向行为(上)
  2. pat 食物链(状态压缩求哈密顿回路)
  3. android 自定义loading,Android自定义动画-StarLoadingView
  4. linux parted rpm,为Everest Linux构建QtParted的rpm包(四)
  5. cmake java_JNI系列之AS支持CMake了
  6. java项目怎样强制删除手机缓存_Myeclipse清理项目缓存的几大方法
  7. C/C++ 读取任意数目的整数
  8. mysql查询动态表名的数据类型_Mysql中查询某个数据库中所有表的字段信息
  9. animation动画不生效_关于CSS3的animation使用的一些坑,需要注意下!
  10. Java对点、线、面生成栅格瓦片jpg,并渲染呈现