(个人记录向,轻喷,望指教)
一、基本类型内存占用
相信我,你最开始就应该知道的,是每个基础类型在不同编译器下占的内存空间大小(位数)。
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++继承时的对象内存模型