浅议C和C++中的内存分配

最近在课堂上听到老师讲了C语言中的内存分配,感觉挺深刻的,于是就写下来,当做是对自己的提醒!

  微机原理的知识告诉我们,内存大致可以分为三部分:代码区 、堆栈区、数据段(我的计算机学的不好,按照自己的理解)。C和C++中有全局变量,静态变量以及局部变量等几类。全局变量和静态变量是在编译的时候就已经分配好在数据段,也就是说在执行main函数之前就已经分配好了地址,如果定义的时候认为初始化,那么就存放初始化的值,如果没有初始化,则由编译器初始化为0。这就说明在整个程序的执行过程中全局变量和静态变量的地址和类型不会发生变化,可能变化的只是他的值。

  对于动态变量,则在编译的阶段并不分配内存,而是执行到相应的代码段时再分配内存。局部变量共有以下几种:

1    int main(void)

  {

    int a;//局部变量定义于main中;

    ...........

    {

    int a;//局部变量定义于代码段内;

    }

  }

2    void fun()

  {

    int a;//局部变量定义于普通函数内;

    ...

  }

3    void fun(int a,int b)//形式参数

  {

   ...

  }

  编译器对局部变量的处理是放入栈中,学过微机原理知道,出栈和入栈操作的操作数都是跟着指令,存在于代码段内的,当函数执行到局部变量出,进行入栈操作,给他分配栈中的内存,供其它操作访问。在使用结束后再出栈。所以,局部变量的生存期是从定义的地方到该函数结束和代码段结束。

  对应情况1第一个,在main函数结束时出栈,第二个在{}内的代码执行结束后出栈。这也很好理解,函数的调用本身就涉及到对指令地址的入栈操作,调用结束后涉及到指令地址的出栈操作:模拟一下如下函数的栈活动:

void fun1(int a)                              

{

  int b;

}

main()

{

  int a;

  fun1();

}

过程:执行到main函数,对CPU IP的指针入栈:入栈1,保护现场环境(这里简化入栈操作) 给局部变量a入栈分配栈内存:入栈2。执行fun1(),对CPU IP的指针入栈:入栈3,保护现场。给形参a入栈,分配栈内存,入栈4,给局部变量b分配栈内存,入栈5,。执行完函数的调用,恢复现场,对入栈5出栈,对入栈4出栈,对CPU IP出栈,函数调用完毕。然后main函数内执行完毕,对入栈2出栈,对入栈1出栈。至此可以看出局部变量的生存期。

你可能感兴趣的:(内存分配)