c++中的内存知识汇总

(个人记录向,轻喷,望指教)

一、基本类型内存占用

相信我,你最开始就应该知道的,是每个基础类型在不同编译器下占的内存空间大小(位数)。
在这里插入图片描述
c++中各类型数据所占字节数(一)

二、内存空间的分区

c++中的内存空间大致可以分为五个区域,分别是栈区(由编译器自动分配释放,存放函数参数值,局部变量值等)、堆区(由程序员分配释放,程序结束后可能会由OS回收)、全局区/静态区(数据区存放全局变量和静态变量,程序结束后由系统释放。需要注意的是未初始化的放在.bbs段,初始化的会放在.data段)、文字/只读常量区(存放常量字符串,程序结束后由系统释放,占据comment区)、程序代码区(存放函数体二进制代码,占据code区)。
五个区域中的重点是堆和栈。

定义:堆是一个记录空闲内存地址的链表。32位计算机的大小
在4G左右。
特点:1、空闲内存块会被封在一个结构体中,这个结构体会包
含该数据块的前驱和后继、该数据块的大小、该数据块的界定符
、数据块本身。2、一般由程序员通过malloc/free、new/
delete等操作申请的内存都是在堆上的。3、堆属于动态分配
。4、地址的扩展是从低地址向高地址扩展。
缺点:频繁的对堆上数据进行新建删除会产生内存碎片,
降低程序效率。

定义:栈是一块连续的内存空间,具有数据结构中栈的特性。
Window操作系统中大小在1M-2M左右。
特点:1、一般会存储函数的参数,函数占用的内存,局部变量
等。2、每个线程都会拥有自己的栈。3、栈即可动态分配也可
静态分配,静态分配由编译器完成,动态分配由alloca函数
完成。4、地址的扩展是从高地址向低地址扩展,数据则是从低
地址往高地址写入。
缺点:内存太小,可能会出现数据覆盖,栈溢出。
栈的分配效率比堆的分配效率要快。因为堆需要栈为中转,
而栈可以直接从寄存器中拿。

c++中堆、栈内存分配
C++:堆和栈的区别
c++中堆、栈内存分配
C/C++程序内存分布

三、函数的内存

C++中的函数的编译方式是将函数根据类的名称、命名空间的名称和参数的名称来进行名字编码。这样的编码方式是为了应对不同命名空间下的函数同名、函数重载和类中函数同名等情况,于是便对每一个函数都赋予一个唯一的函数名

class A{
void func( int a,double b){}//可能的名字就是func_A_int_double
void func(int a,int b){}//可能的名字就是func_A_int_int
}

当用户需要调用某个函数的时候,便会根据这个唯一的函数名去调用对应的函数体。

C++函数中的调用过程中内存的变化
(函数的调用基本在栈内实现,当然函数体不在栈内,在代码区)
在这里插入图片描述
C++函数编译原理和成员函数的实现
函数调用过程中栈到底是怎么压入和弹出的?

四、对象的内存

首先你得知道:对象中的内存大小只与类中的成员变量有关,与成员函数无关
一个类的所有对象在内存空间中的表现如下图所示。
在这里插入图片描述
每个对象都只会保存自己的数据,当需要调用成员函数的时候,只会去类中公共成员函数的存放地址处调用。对象将会传入一个自身的this指针,函数就会去拿取对象地址中的成员变量,执行函数操作。
C++成员函数在内存中的存储方式

五、对象在多态下的内存变化

由于情况太多,就不再这里总结了,有需要可以去参考博客中查看。
C++继承时的对象内存模型

六、对象含有虚函数时的内存变化

C++虚函数表(多态的实现原理)
C++虚继承和虚基类详解
C++继承时的对象内存模型

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值