C的虚拟内存区域划分
Code Area(代码区)
:程序代码指令、常量字符串,只可读。Static Area(静态区、全局区)
:存放全局变量/常量、静态变量/常量。 该区域的大小在程序一加载进内存的时候就已固定,但是静态变量的值是可以改的。Heap(堆)
:由程序员控制,使用malloc/free来操作。(空间最大)Stack(栈)
:预先设定大小,自动分配与释放。常量区
对于可执行程序而言,可以分为:
Text段
:代码段,就是放程序代码的,编译时确定,只读Data段
:存放在编译阶段(而非运行时)就能确定的数据,可读可写。也就是通常所说的静态存储区,赋了初值的全局变量和赋初值的静态变量存放在这个区域,常量也存在这个区域Bss段
:已经定义但没赋初值的全局变量和静态变量存放在这个区域。
![[Pasted image 84.png]]
![[Pasted image 85.png]]
堆
堆的地址是向上延伸的
![[Pasted image 86.png]]
栈
栈的地址是向下减小的
![[Pasted image 87.png]]
![[Pasted image 83.png]]
//注意:c语言的形参是从右到左入栈的,b先入栈,a后入栈;a先出栈,b后出栈。
int abc(int a, int b)
{
}
因为c语言是底层语言,包括操作系统本身就是用c语言写的,所以呢,很多时候是这样的:用c语言来写一个库,再用其他语言来调用。
但是呢,不能保证所有的语言都是从右到左入栈的。所以其他语言在调用c语言写的库的时候,要遵循c语言的规范。
优化、区别
- 栈的访问速度比堆快很多
原因:
- 栈的cache命中率高于堆,堆的内容被操作系统交换到外存的概率比栈大,栈一般是不会被交换出去的,
- 栈有专用寄存器支持,并有pop、push等专用汇编指令支持
- 堆的分配和释放要调用malloc、free函数,要花费时间且可能会造成内存碎片,而栈不需要这些工作
- 堆的访问需要先取得指针,再取得数据,而栈只需一次访问
- 栈内容在编译的时候已经确定
- 堆分配内存之后要与存储器之间建立映射
- 栈的空间只有几M~几十M,所以不可以申请大临时变量