淘宝禁止了网站建设类,甘井子区城市建设管理局网站,wordpress胖鼠采集,北京到安阳的火车说明
C/C软件运行时#xff0c;内存根据使用方式的不同分为堆内存和栈内存#xff0c;栈内存使用有以下特征#xff1a;
栈内存使用#xff08;申请、释放#xff09;由系统自动分配和释放#xff0c;程序员不用做任何操作。栈内存重复使用#xff0c;进入函数时数据入…说明
C/C软件运行时内存根据使用方式的不同分为堆内存和栈内存栈内存使用有以下特征
栈内存使用申请、释放由系统自动分配和释放程序员不用做任何操作。栈内存重复使用进入函数时数据入栈函数执行完数据出栈。
函数中的局部变量以及实参保存在栈内存中。
内存模型 栈内存处于进程虚拟内存的高地址从高往低扩展。堆内存处于进程虚拟内存的低地址从低往高扩展。
原理
在数据结构领域栈是一种仅在尾部进行插入或删除操作的线性表以后进先出的规则管理数据先进入的数据被压入栈底最后的数据在栈顶压入数据叫做入栈弹出数据叫做出栈。函数调用关系也是一种栈的形式先进后出第一个函数main最后执行完末端函数最先执行完。因此使用栈的形式来管理函数调用中的临时内存使用局部变量等是非常合适的而非临时的内存使用则需要通过另外一种方式堆内存来管理所以系统将进程的虚拟内存划分为栈内存和堆内存。栈内存和堆内存本质上就是一块内存空间只是不同的使用方式而已对于编译器就是不同的使用规范。
操作单元
入栈出栈的操作单元并不是单个变量而是整个函数整个函数所需栈内存大小在编译时就能确认入栈和出栈都是以整个函数需要的栈内存大小为单位一次性扩大/缩小栈内存空间。以及其它使用考量例如函数调用栈回溯等操作单元不仅仅是函数临时变量局部变量实参等所需的栈内存空间编译器还会保存一些其它信息例如为了解决函数调用栈中间函数跳转问题需要将LR保存在栈中。整个操作单元就叫做栈帧。
栈帧Stack Frame
每一次函数调用,都会在栈内存上维护一个独立的栈帧(stack frame)栈帧大小是编译时确认的就是该函数需要占多少栈空间.每个独立的栈帧一般包括:
函数参数临时变量: 包括函数的非静态局部变量以及编译器自动生成的其他临时变量函数调用的上下文例如帧指针(Frame Pointer)和返回地址LR等
入栈、出栈操作
不同平台函数调用的入栈和函数结束的出栈操作有细微差别ARMV8平台操作。