内存结构

来源:互联网 发布:淘宝身份认证失败 编辑:程序博客网 时间:2024/05/16 23:37

  想要真正了解编程,对内存的结构认识是必不可少的,这类文章在网上很多了,而且都是限定死的,也就不再赘述,发出来方便大家及自己比对查看。
这里写图片描述
BSS段: BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。通常我们常说的全局数据区(静态数据区)就存在于数据段。

在进程的整个生命周期中,数据段和BSS段内的数据是跟整个进程同生共死的,也就是在进程结束之后这些数据才会寿终就寝。

代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。代码段是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈(stack):栈又称堆栈,它是一种运算受限的线性表。是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,删除后,其相邻的元素成为新的栈顶元素(先进后出)。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

堆栈是一块连续的内存空间,栈空间从高地址向低地址增加,堆空间从低地址向高地址增加
这里写图片描述

0 0