Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125737
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-01 15:34
个人简介

不晓得说啥子

文章分类

全部博文(42)

文章存档

2015年(41)

2014年(1)

我的朋友

分类: C/C++

2015-04-12 10:25:11

    

进程运行时的五个数据段如下图所示:


                                               



     
BSS段(bss segment): 通常是指用来存放程序中未被初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

    

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

     
      代码段(code segment/ text segment):又称常量区,通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行时就已经确定并且内存区域通常属于只读,某些构架也允许代码段可写,即允许修改程序。在代码段中也会包含一些只读的常数变量,例如字符串常量等。如  char *ptr = "text in the code segment",其中 "text in the code segment" 就存放在代码段(常量区),并且不可以对该文本进行写操作。

     
       堆(heap)
:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可以动态的增加或者是减少。进程调用malloc(calloc realloc )进行动态内存分配,新分配的内存会被添加到堆上(堆的扩张),当进程利用free释放分配的内存时,被释放的内存从堆中删除(堆的缩减)。注意alloca是在栈上分配的内存,当语句块无效时,会被自动释放,如果需要临时缓冲区,可以在站上使用alloca分配内存,使用alloca 分配的内存无需手动释放(和malloc不同)

     
     栈(stack)
:栈又称为堆栈, 用于存进程临时创建的局部变量,也就是说我们函数括弧“{ }”中定义的变量,但是不包括static声明的变量,static意味着在数据段中存放该变量。除此之外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且等待调用结束后,函数的返回值也会被压入栈中。由于栈又先进后出的特点,所以栈特别方便用来保存/恢复调用现场。 从这个意义上讲,我们可以把栈看成一个寄存、交换临时数据的内存区。


     bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。


     堆栈段的共能:
     
     1、为函数内部声明的局部变量提供存储空间。
     2、函数调用时,存储和维护与此相关的信息。
     3、可以作为临时缓冲区,如果计算很长的算术表达式,可以把部分计算结果压到栈中,当需要时,再从栈中提取。可以通     过alloca函数分配栈中的临时空间,而不在堆中分配空间。

     

阅读(1131) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~