慢慢开始学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指针调用的成员函数,其地址固定

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

c++ class里面成员和分配内存问题的更多相关文章

  1. linux设备驱动归纳总结(五):1.在内核空间分配内存【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-79134.html linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxx ...

  2. 高端内存映射之vmalloc分配内存中不连续的页--Linux内存管理(十九)

    1 内存中不连续的页的分配 根据上文的讲述, 我们知道物理上连续的映射对内核是最好的, 但并不总能成功地使用. 在分配一大块内存时, 可能竭尽全力也无法找到连续的内存块. 在用户空间中这不是问题,因为 ...

  3. C++成员函数在内存中的存储方式

    用类去定义对象时,系统会为每一个对象分配存储空间.如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间.按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码分 ...

  4. 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)

    本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上?             成员函数可以被看作是类 ...

  5. C++ 内存、new与malloc分配内存区别?

    一关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2)在栈上创建. ...

  6. Go语言实例化结构体——为结构体分配内存并初始化

    转自: http://c.biancheng.net/view/66.html 结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存.因此必须在定义结构体并实例化后才能使用结构 ...

  7. 【Linux开发】linux设备驱动归纳总结(五):1.在内核空间分配内存

    linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  8. 使用 Lookaside List 分配内存

    1. 概述 windows 提供了一种基于 lookaside list 的快速内存分配方案,区别于一般的使用 ExAllocatePoolWithTag() 系列函数的内存分配方式.每次从 look ...

  9. 20140319 const sizeof define 编译时分配内存

    1.面试宝典预处理,const,sizeof Define作用定义函数: //用一个宏定义FIND求一个结构体struc里某个变量相对于struc的偏移量,如FIND(student,a)//等于0 ...

随机推荐

  1. WPF---数据绑定之Xml数据源(四)

    一.场景 现在外部有一xml文件,我们想将该xml文件中的内容绑定到ListView中,该如何实现? 二.实现 xml文件的内容如下: <?xml version="1.0" ...

  2. 深入浅出Mybatis系列(三)---配置简介(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(二)---Mybatis入门>写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们以  ...

  3. hdu1002 大数相加问题

    这个题对于 几个月前的我简直是噩梦  好在磕磕绊绊终于写出来了 由于自己的问题  还被巨巨嘲讽了 1 1.#include<stdio.h> 2 2.#include<string. ...

  4. vue中的v-cloak指令

    v-cloak不需要表达式,它会在vue实例结束编译时从绑定的html元素上移除,经常和display:none;配合使用: <div id="app" v-cloak> ...

  5. 初步测试VS2017+Win10IoT,基于World Map of Makers

    测试World Map of Makers Demo,创建一个简单的internet连接应用程序来查询web API的状态(目测是一个延时时间),并使用该信息切换LED. 官方仓库的Solution是 ...

  6. MySQL-后知知觉的索引

       什么是索引? 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能 非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重 ...

  7. MVC模式职责分工及学习路上的一些感想

    在正文之前想先说说自己coding道路上的一点感想,不得不感慨一下时间过得很快,之前写过一篇关于JavaWeb_MVC模式的一篇博客,转眼之间时间已经过去了两个月,那时候还是一个刚刚接触JavaWeb ...

  8. RabbitMQ之消息模式2

    消费端限流 什么是消费端的限流? 假设一个场景,首先,我们RabbitMQ服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法 ...

  9. Vue CSS模拟菜单点击变色

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  10. freeswitch python模块

    概述 freeswitch支持多种语言的业务开发,包括C/C++,java,python,js,lua,Golang等等.freeswitch在使用python做业务开发时,有俩种接入方式,一种是ES ...