全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别.pdfVIP

全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别.pdf

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别

一、程序的内存分配 一个由 C/C++编译的程序占用的内存分为以下几个部分: 1、栈区 (stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的 值等。其操作方式类似于数据结构中的栈。 2、堆区 (heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可 能由 OS 回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区 (静态区)(static)— 全局变量和静态变量的存储是放在一块的, 初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的 静态变量在相邻的另一块区域。程序结束后有系统释放 4、文字常量区 — 常量字符串就是放在这里的。 程序结束后由系统释放。 5、程序代码区 — 存放函数体的二进制代码。 二、例子程序 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b;// 栈 char s[] = abc; //栈 char *p2; //栈 char *p3 = 123456; 123456\0;//在常量区,p3 在栈上。 static int c =0; //全局 (静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得 10 和 20 字节的区域就在堆区。 strcpy(p1, 123456); //123456\0 放在常量区,编译器可能会将它与 p3 所 指向的123456优化成一个地方。 } 三、从作用域看: 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所 有的源文件。当然,其他不包含全局变量定义的源文件需要用 extern 关键字再 次声明这个全局变量。 局部变量也只有局部作用域,它是自动对象 (auto),它在程序运行期间不是一 直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销, 其所占用的内存也被收回。 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程 序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可 见的,而静态局部变量只对定义自己的函数体始终可见。 静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文 件的话,它作用于定义它的文件里,不能作用到其它文件里,即被 static 关键 字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字 的静态全局变量,它们也是不同的变量。 从分配内存空间看: 全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量 在栈里分配空间。 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即 改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了 它的使用范围。因此 static 这个说明符在不同的地方所起的作用是不同的。 四、总的来说就是: 1、生存周期不同 2、作用范围不同 3、分配方式不同 再来看下堆和栈的不同: 1、分配方式不同; 2、空间大小不同; 3、分配效率不同; 4、能否产生碎片不同; 5、生长方向不同; 1、分配方式不同 栈: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中 为 b 开辟空间 堆: 需要程序员自己申请,并指明大小,在 c 中malloc 函数 如 p1 = (char *)malloc(10); 在 C++中用new 运算符 如 p2 = (char *)new(10); 但是注意 p1、p2 本身是在栈中的。 2、 空间大小不同 一般来讲在 32 位系统下,堆内存可以达到 4G 的空间,从这个角度来看堆内存几 乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如, 在 VC6 下面,默认的栈空间大小是 1M。 3、分配效率 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存 器存放栈的地址,压栈出栈都有专门的指令执 行,这就决定了栈的效率比较高。 堆则是 C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库 函数会按照一定的算法 (具体的算法可以参考 数据结构/操作系统)在堆内存中 有哪些信誉好的足球投注网站可用的足够大小的空间,

文档评论(0)

f8r9t5c + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档