C++面向对象的内存布局(一)

C++中可以使用struct、class来定义一个类

struct和class的区别
struct的默认成员权限是public
class的默认成员权限是private
实际开发中,用class表示类比较多

变量名规范参考

全局变量:g_
成员变量:m_
静态变量:s_
常量:c_
使用驼峰标识

类实例化成为了对象,对象的内存空间由成员变量决定

对象的内存都是在函数的栈空间,自动分配和回收的
每个对象都有自己的成员变量,每次创建分配各自的内存
但是类里的函数(方法)每个对象都可以调用,所以没有必要存放在每个对象的空间里,每个方法在内存中只有一份
编译器发现有调用这个方法,就在内存中生成这个方法的地址,当对象调用时直接call 函数地址,若没有发现调用这个方法,就不编译,这实际是编译器的优化。

对象

查看对象的内存大小
在这里插入图片描述
查看对象及成员变量的内存地址
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对象的内存布局

在这里插入图片描述
每个应用都有自己独立的内存空间,其内存空间一般都有以下几大区域

代码段(代码区)

用于存放代码,如main函数和其他函数
在这里插入图片描述

数据段(全局区)

用于存放全局变量等

栈空间

每调用一个函数就会给它分配一段连续的栈空间,等函数调用完毕后会自动回收这段栈空间
自动分配和回收
在这里插入图片描述

堆空间

需要主动去申请和释放

调用函数就是CPU访问代码区的机器指令,代码区只是存放代码且是只读的,函数的局部变量是可以更改的,所以调用函数的时候需要分配额外的存储空间去存储函数内部的局部变量,所以就需要代码区的函数访问到了栈空间里的对象的成员,这就需要this

this

this是指向当前对象的指针,存储着函数调用者的地址
对象在调用成员函数的时候,会自动传入当前对象的内存地址

没有this的时候
不管person对象在哪个空间,在执行代码段时都能访问到在这里插入图片描述
+上this在这里插入图片描述
汇编代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

this指针必须用->,不能用. (点左边只能是对象),可省略(语法上默认用了this)

指针间接访问所指向对象的成员变量:
1.从指针中取出对象的地址
2.利用对象的地址+成员变量的偏移量计算出成员变量的地址
在这里插入图片描述
在这里插入图片描述
函数调用栈时,用0xcc去填充栈空间,用它来覆盖以前栈空间剩余的垃圾数据,0xcc表示int 3(中断,起到断点的作用) 超出函数栈空间内存区域的值用0xcc表示,
上面四个是寄存器的值,不属于栈空间
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值