局部变量、全局变量、堆、堆栈、静态和全局
一般全局变量存放在数据区,局部变量存放在栈区,动态变量存放在堆区,函数代码放在
代码区。
栈区是普通的栈数据结构,遵循 LIFO 后进先出的规则,局部变量安排在那里是 ASM 时就规
定的,这样可以在一个函数结束后平衡堆栈,操作简单,效率高堆(动态区)在这里应当叫堆栈
(不要和数据结构中的堆搞混)是程序在编译时产生的一块用于产生动态内存分配使用的块,
操作比较栈要麻烦许多,在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的
NEW 和 DELETE 产生的夹在两块使用中内存中的空余小内存(不容易被分配))),分配和回收
时的效率比栈低多了栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活
而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率 >有一定降低。
栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不
同堆分配的内存无法互相操作。
栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量 (auto)的分配。
动态分配由 alloca 函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可
移植>的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程
序结束时所有的数据空间都会被释放回系统,但是精确的申请内存 /释放内存匹>配是良好
程序的基本要素。这是我对堆与栈收藏内容~堆是程序员管理的,栈是系统管理的.
另外关于静态和全局的一些问题:
静态变量的特点:
1、一次存储:静态局部变量只被初始化一次,下一次初始化根据上一次的结果值,有点类
似于 c++中类的静态成员变量,即无论该类型生成多少个实例对象,所有的对象共用一个
静态变量,到这里就是无论这个函数调用多少次,该静态变量只初始化一次,并没有因为
超出其生存期而被销毁,只是外部不可见而已,用个例子说明之:
Void fun1(int v)
{
static int value=v;
static int value=v;
}
int main(int arc,char*args[])
{
fun1(50);
fun1(100);
}
执行的结果是:value:50 value:50 说明在第二次调用 fun1()时的初始化 value 的采用的是上
一次 value 的值,value 在静态区的存储空间并没有因为 fun1()的结束而被释放,即体现了
一次存储;
2、作用域限定:静态修饰的作用域限定功能同时体现在函数与变量上;
a)对于函数而言,任何用 static 修饰的函数,其作用域仅为当前源文件,而对外部来说这个
函数是不可见的,即只有和其在同一源文件中的函数才能调用这个静态函数;反过来说,
如果一个函数仅仅被同一源文件中的其他函数调用,那么这个函数应该声明为静态的,这
样做的好处在于:可以一定程度上的解决不同源文件之间函数的命名冲突问题;
b)对于变量而言,static 修饰的全局变量,只在当前源文件中有效,对外部不可见,外部文
件不能够引用;
顾名思义,全局变量是指能够在全局引用的变量,相对于局部变量的概念,也叫外部变量
评论1
最新资源