linux——堆、栈、内存映射

C的虚拟内存区域划分

  1. Code Area(代码区):程序代码指令、常量字符串,只可读。
  2. Static Area(静态区、全局区):存放全局变量/常量、静态变量/常量。 该区域的大小在程序一加载进内存的时候就已固定,但是静态变量的值是可以改的。
  3. Heap(堆):由程序员控制,使用malloc/free来操作。(空间最大)
  4. Stack(栈):预先设定大小,自动分配与释放。
  5. 常量区

对于可执行程序而言,可以分为:

  1. Text段:代码段,就是放程序代码的,编译时确定,只读
  2. Data段:存放在编译阶段(而非运行时)就能确定的数据,可读可写。也就是通常所说的静态存储区,赋了初值的全局变量和赋初值的静态变量存放在这个区域,常量也存在这个区域
  3. 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语言的规范。

优化、区别

  1. 栈的访问速度比堆快很多

原因:

  1. 栈的cache命中率高于堆,堆的内容被操作系统交换到外存的概率比栈大,栈一般是不会被交换出去的,
  2. 栈有专用寄存器支持,并有pop、push等专用汇编指令支持
  3. 堆的分配和释放要调用malloc、free函数,要花费时间且可能会造成内存碎片,而栈不需要这些工作
  4. 堆的访问需要先取得指针,再取得数据,而栈只需一次访问
  1. 栈内容在编译的时候已经确定
  2. 堆分配内存之后要与存储器之间建立映射
  3. 栈的空间只有几M~几十M,所以不可以申请大临时变量
posted @ 2023-04-18 14:30  爱喝拿铁  阅读(195)  评论(0)    收藏  举报