您的位置:首页 > 其它

不同类型数据对象

2012-06-05 10:53 218 查看
有的把程序的内存划分为堆、栈、全局区、文字常量区、文本区。

全局区又叫静态存储区(我以为叫静态存储区好些,有些局部的静态数据对象也放在这个区,静态区的静态是相对堆、栈来讲的,在程序开始时候已经分配好空间),分为data段和bss段,其中data段存放初始化的全局变量和静态变量,而bss段存放为未初始化的全局变量和局部变量。

文字常量区存放字符串常量,结束后程序自动释放。

1.初始化数据段和未初始化数据段

为什么它们是一类的呢,因为它们在程序开始运行的时候,都会先分配好空间,未初始化的数据段包括未初始化的全局变量和静态变量,它们在分配数据段的时候会由程序自动的清零,而在a.out中由于编译器优化,并没有占据实际的那么大的空间是是有一个字段说明了需要的bss段的大小。这也是bss段存在的意义!Better Save Space~为了优化,节省a.out文件的额大小而初始化数据段是会在a.out文件中占用同等空间的,程序运行时直接从a.out载入,放入自己相应的段中。

2.堆对象和栈对象

它们都是在运行的时候才生成的。程序开始的时候并没有自己的存储空间。

关于栈对象

栈对象是自动生成,又在适当的时候自动销毁,不需要程序员关心,这样就有一个非常大的好处。可以把类对象定义在栈上,只要完善好析构函数,当超出这个类对象的作用域的时候会自动清理空间。但是它必须在编译的时候确定大小,创建的速度一般较堆对象速度要快,在创建堆对象的时候会采取某种空间搜索算法找到合适的空间,而可能搜索算法是比较浪费时间的。而栈对象仅仅移动栈指针就可以了。但是栈空间一般较小,较大的递归会可能栈溢出。

关于堆对象

特点就是可动态按需划分大小,切空间较大,一般不会有堆溢出的情况,当物理内存不够的时候会使用虚拟内存来扩展。必须用指针来访问,程序员控制生存周期。

3.静态对象的作用

全局对象为类间的通信和函数通信提供了一种最简单的方式,但是一般而言全局对象意味着不安全和高耦合,在程序中使用全局对象会降低程序的健壮性、稳定性、可维护性和复用性。

类的静态成员属于整个类,可以为类对象提供一种方便的通信方式。

局部静态对象可用于递归调用的时候,保存自身的上一次结果。

4.static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。  

3) static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件   

综上所述:

static全局变量与普通的全局变量有什么区别:

static全局变量只初使化一次,防止在其他文件单元中被引用;   

static局部变量和普通局部变量有什么区别:

static局部变量只被初始化一次,下一次依据上一次结果值;   

static函数与普通函数有什么区别:

static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: