浅谈内存管理

来源:互联网 发布:极速法术升级数据 编辑:程序博客网 时间:2024/05/18 11:25

内存分区有哪些?


    a)栈(stack):存储函数内部的变量,包括局部变量和形式参数,在进入函数时自动分配,离开函数时自动清除

    b)全局区:又叫静态区,存放全局变量和静态变量,全局变量也称外部变量,它是在函数外部定义的变量,全局

量是所有函数的公用变量。静态变量和全局变量被分配到同一块内存中,静态局部变量仅限于在定义处的函数使

用,但是离开函数后数值一直保留,直到程序退出。静态区又分为数据段和代码段,数据段分为data段和bss段,

data段存放已初始化的静态变量和全局变量,bss段存放未初始化的静态变量和全局变量,并且会将这些变量初始

化为0.

我将linux虚拟机下的程序运行过程中的各段大小展示出来~~~

在linux虚拟机下,我写出以下代码,并保存在memory.c文件中。

<pre name="code" class="objc">#include<stdio.h>static int m = 2;    int i;int g_i = 0;static int n;int main(){    int j = 0;    printf("love you");}


用gcc memory.c编译文件,用size指令size a.out来观察各段大小


  当我删除未初始化的全局变量,也就是int i ;时,再编译运行。


所以说,未初始化的全局变量在bss段。

接下来,删除语句static int n;运行。


bss段的大小又少了4,那么未初始化的静态变量也在bss段。

删除int g_i = 0;语句后,情况又将如何呢??

 

已初始化的全局变量也在bss段。咦,这好像和上边整理的不一样呢。到底是什么原因呢??bss段一般放的变量系

统都会给他初始化,就相当于bss段放的变量也是初始化了的。

用同样的方法测试删除已经初始化的静态变量,他是存放在data段的,这里就不给出了。

特别的,我们来删除main函数里的变量int j = 0;这次又会出现怎样的现象呢??


此图我们可以看出text段的内容减少了,这并不是说,局部变量存放在text里,而是变成机器码存放在文本text中。

最后我们可以得到这样一张关于a.out的图 :


c)堆(heap):由调用malloc,realloc等等函数分配的内存块,使用完后需要释放;

   d)常量存储区:存放程序内所有字符串常量,这个内存区域上存储的内容不允许修改,直到程序退出为止。

内存四区的特点:

  a)全局区的变量空间缺省每个字节都是00,栈空间缺省是cc,堆缺省是cd。

  b)堆、全局区(静态区)、字符串常量区比较靠近,与栈空间距离大;

  c)常量区的内存是只读的,写入时程序崩溃;

  d)访问速度是栈最快。

关于栈:栈是从高地址向低地址增长。ebp指向栈的高地址,esp指向低地址。

1 0