您的位置:首页 > 其它

全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?

2009-12-22 14:45 639 查看
全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?

区别就是作用域的区别,局部变量局部可见,全局变量,所有参与链接的模块都可以通过extern来操作该变量.

局部变量

{
}

内部定义的非静态变量都是局部变量了

全局变量:在函数外部定义的非静态变量就是全局变量了

操作系统不需要知道谁是局部,谁是全局的。编译器根据变量定义的位置,类型来判断是全局的还是局部的变量

生命周期,访问范围

数据段,栈

操作系统为什么需要知道?(可执行文件格式 ?) 编译器根据声明的位置

全局变量为外部变量,其作用域是从定义点到程序结束..

局部变量就表示局限于某个作用域的变量,它可以在函数内以函数作为作用域,可以在for/while/if语句中,以语句块作为作用域,还可以在namespace中,以命名空间作为作用域.

在操作系统中,全局变量存储在内存的静态存储区域,而局部变量存放在内存的栈区.

全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?

全局变量和局部变量的区别是作用域不同,全局变量从定义位置开始到程序结束,而局部变量只限定义的函数内可使用,全局变量在数据段,而局部变量在栈,局部
变量在函数结束时内存空间就被系统收回,所以要返回的数组或字符串不要用局部变量定义.extren和在main()函数外定义的变量都称为全局变量,操
作系统和编译器从定义变量为变量分配内存时,从变量的定义和存储区域来分别局部变量和全局变量.

这是编程之基本啊~~,1楼正解!

全局都放在静态存储区,局部一般临时分配在栈里,生命周期到,自动释放内存!

去看下函数中的变量,auto,static,extern,register!~~

操作系统和编译器通过内存分配的位置来知道的全局变量分配在全局数据段,并且在程序被运行的时候就被加载。

编译器通过语法词法的分析,判断出是全局变量还是局部变量。如果是全局变量的话,编译器在将源代码翻译成二进制代码时就为全局变量分配好一个虚拟地址
(windows下0x00400000以上的地址,也就是所说的全局区),所以程序在对全局变量的操作时是对一个硬编码的地址操做。

局部变量的话,编译时不分配空间,而是以相对于ebp或esp的偏移来表示局部变量的地址,所以局部变量内存是在局部变量所在的函数被调用时才真正分配。
以汇编的角度来看:函数执行时,局部变量在栈中分配,函数调用完毕释放局部变量对应的内存,另外局部变量可以直接分配在寄存器中。

操作系统通过变量的分配地址就可以判断出是局部变量和全局变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐