对于全局变量和局部变量的质疑。

 我想从系统的角度出发来说说我的理解。

每个进程都有自己的进程空间4G,进程空间又分为用户空间和系统空间。

用户空间一般在2G以下的地址空间,可以被应用程序访问它的大部分,系统空间在2G以上,不可以被应用程序访问。

应用程序的全局变量保存在用户空间(毋庸置疑),局部变量(即函数内变量分配的内存)是否也保存在用户空间?

假设1:局部变量保存在用户空间。

提出的问题是,它保存在用户空间的什么位置?

A 、缺省堆                         B、自己的线程的堆                       C、其他内存区域。

假设A:我们知道缺省堆是进程创建时就创建的一个堆内存,提供给一些DLL模块初始化或者一些比如Unicode 和ASNI字符

转换函数临时所用时的堆,我个人觉得可以排除。

假设B:线程运行时,可以创建属于自己的堆内存,但是我们知道需要用堆内存必须使用HeapAlloc来在堆里分配内存块

才能使用,看似这种情况好像不可能出现,因为我们没有发现使用这样的函数来分配内存,可是也许我们忽略了一个问题,

有可能被编译器给包办了,谁知道我们代码里的int x ;这条语句有可能被编译器处理时就调用了HeapAlloc呢?我是这么个猜测

罢了!

假设C:在用户空间的其他内存区域里面,显然,如果用户不去用什么VirtualAlloc等内存分配等函数,也不会出现的,因此

可以怀疑是编译器来包办。【这里声明作者对编译器不了解!】

 

假设2:局部变量不保存在用户空间而是系统空间。

这里就简单了,只会有一种可能就是线程的栈。

我们知道每次创建线程时,系统就会在系统空间里为线程分配出一块区域(一般为1MB)作为栈,主要是用于保存

该线程挂起时的寄存器状态和其他重要信息。

那就猜想很有可能保存在这里了,因为栈的特点就是先进后出,于是如果在一个函数内的局部变量保存在栈里,当函数

退出时,必然变量就会被pop,这里相当符合局部变量的定义,但是我还是对这样的存储方式产生了质疑。

因为系统空间是不可能被用户访问的,这样的存储势必会对系统空间造成威胁。虽然说栈里用了警戒页来作为保护措施。

 

好了,我理解说完了,希望有高人点拨,局部变量到底是怎样?我学习windows还没多久,如果有错误的地方

一定要说哦。

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值