C语言/C++的内存空间情况,全篇大总结(持续更新)

目录

  • 一、变量
            • 1.全局变量
            • 2.局部变量
            • 3.static静态变量
            • 4.auto自动变量
  • 关于程序运行时函数的堆栈内存空间分配情况

本篇文章主要为了:
1.编程时快速回忆起相关重要概念
2.考试前巩固重要知识点

全文秉持“快速掌握”理念,默认阅读者已经知晓编程最基本的知识,没有使用复杂的例子、多余的废话

一、变量

变量可按照作用域分为以下几类(其中有些是包含关系):

1.全局变量
2.局部变量
3.static静态变量

静态变量在编译时就进行初始化(若未主动赋值 则自动初始化为0),因为它们的地址是已知的并且是固定的,将它们初始化为0不会产生运行时成本。

静态变量的存储方式与全局变量一样,都是静态存储方式。但这里需要特别说明的是,静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量。例如,全局变量虽然属于静态存储方式,但并不是静态变量,它必须由 static 加以定义后才能成为静态全局变量。

静态变量的作用看我写的另一篇文章(点我)

4.auto自动变量

自动变量会由所在函数 的不同调用 而分配到不同的地址,若 程序运行中每次调用该函数时都将 未主动赋值的变量初始化为0,会导致不必要的运行时成本。
不作专门说明的局部变量均是自动变量,自动变量也可用关键字auto作出说明。

关于程序运行时函数的堆栈内存空间分配情况

程序运行时主函数main和其他函数的内存空间是分配到同一个栈,每次程序开始运行时都会创建一个栈,main函数就在栈底,然后通过不同函数的调用顺序,依次进栈出栈。堆是程序动态分配的空间,每次分配的空间不一定是连续的。
C语言/C++的内存空间情况,全篇大总结(持续更新)_第1张图片

  1. 关于栈内存分配,系统自动分配。在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,一般使用寄存器来存取,效率很高,但是分配的内存容量有限。
    C语言/C++的内存空间情况,全篇大总结(持续更新)_第2张图片
  2. 关于堆内存分配,亦称动态内存分配,根据编写的代码分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete来释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。
  3. 关于静态存储区内存分配,全局变量全部存储在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态的进行分配和释放。

栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行。堆则是C函数库提供的,它的机制很复杂,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大的空间,如果没有足够大的空间(可能是由于内存碎片太多),就有需要操作系统来重新整理内存空间,这样就有机会分到足够大小的内存,然后返回。显然,堆的效率比栈要低得多。

最后,编译器一般使用栈来存放函数的参数、局部变量等来实现函数调用。有时候函数有嵌套调用,这个时候栈中会有多个函数的信息,每个函数占用一个连续的区域。一个函数占用的区域被称作帧。同时栈是线程独立的,每个线程都有自己的栈。一个线程只有一个栈,这个线程中执行的所有函数都会用这个栈。函数被调用的时候会在栈顶开辟一部分空间(实质上只是将栈顶上移)保存自己的数据,这些数据就包括函数的参数、返回地址、局部变量。函数返回的时候只要把栈顶回复到被调用前的状态就把它占用的空间释放了。

感谢阅读~

你可能感兴趣的:(计科基本功,C语言/C++,c语言,内存,地址,c++,学习)