慢慢开始学c++啦,记录学习的大体过程

class中神奇的内存(sizeof)

1.内存补齐

便于管理类(生成的对象)的内存,类总内存总是为最大成员字节大小的倍数,不足的会进行内存补齐

类的整体内存就是由n块最大成员字节大小的区域组成的

而内存的分配对于成员变量来说是按照书写顺序来的(也就是构造顺序)如果不足最大成员大小,就自动填充

后一位变量如果无法排在前一位变量的那一块内存里面,就直接再开拓一块最大成员字节大小的空间存放自己,前一位的剩余空间自动填充

class A{   //sizeof = 8
int a;
char b;
short c;
}; class B{ //sizeof = 12
char a;
int b;
short c;
};

上面类A,B,最大都是int 4字节 :

A类,第一个是int ,4字节全部填满; 第二个char,1字节,还剩3字节;第三个short,2字节,补在第二个空间后,还剩一个字节自动补齐,一共2*4=8字节

B类,第一个是char,1字节,还剩三个字节;第二个int,4字节,第一个剩的空间不够,直接开拓下一个4字节,剩下的三字节自动填满;第三个short,2字节,还剩2字节自动补齐,一共3*4=12

2.特殊情况--virtual函数

如果一个类里面有虚函数,类会自动生成一个虚函数表指针4字节的来管理虚函数

一个类无论有几个虚函数都只有有一个四字节的指针

而且这个指针在其他成员之前生成,也就是和你写虚函数的顺序无关

比如:

class A{            //实际上sizeof = 2*4=8 ,而不是12
char a;
virtual void f() {}
short b;
};

上面等价于

class A{
T *table //虚函数指针
char a;
short b;
};

按照上面的方法可得sizeof = 8

同样,由于虚函数指针是四个字节,如果成员里面有更高字节的,同样内存补齐

class A{                //sizeof = 8*2 = 16
virtual void f() {}
double a;
};

3.不需要考虑的内存

每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间

一些看似成员的要注意不算内存

如:

一.静态函数和变量

静态函数和变量都不属于类管理,统一在常量内存区里面

二.非虚函数的成员函数

不是每一个对象都会生成成员函数,类的成员函数在其他内存区,对象用this指针调用的成员函数,其地址固定

三.友元函数和非虚函数的成员函数性质一样

最新文章

  1. [LeetCode] Shortest Word Distance II 最短单词距离之二
  2. DSP using MATLAB示例 Example3.5
  3. xcode import<xx/xx.h> 头文件报错
  4. UVa 10892 (GCD) LCM Cardinality
  5. ASP.NET实现折线图的绘制
  6. 李洪强漫谈iOS开发[C语言-015]-变量的使用
  7. Eclipse + Pydev 配置Python开发环境
  8. 关于一个简单面试题(。net)
  9. 以前用Delphi写的CSDN免积分下载器
  10. HAproxy+varnish动静分离部署wordpress
  11. Easyui后台管理角色权限控制
  12. 【工具篇】.NET开发常用工具
  13. mybatis逆向工程
  14. java两种动态代理方式的理解
  15. 关于Mac设置alias别名访问服务器
  16. 关于pyx文件的修改
  17. 575. Distribute Candies
  18. css与dom的渲染与解析
  19. Hibernate 离线对象构建通用查询
  20. matplotlib绘图总结《转》

热门文章

  1. JAVA虚拟机中的堆内存Heap与栈内存Stack
  2. Nginx使用Lua模块实现WAF
  3. JavaScript高级程序设计(读书笔记)之BOM
  4. Linux系统的内核编译
  5. go语言文件系统
  6. K8S——Pod
  7. 羽夏笔记——Win32(非WinAPI)
  8. 学了这么多年C语言,你真的知道全局变量,局部变量,静态变量,本地函数,外部函数是如何区分标识的吗?
  9. React Native踩坑日记 —— tailwind-rn
  10. qsc oj-17 喵哈哈村的排队