急急急急急。。。。,保证给分

comecsdn 2002-09-09 11:28:59
MS说值是存在于堆栈中,引用类型存在于堆中。
一个例子就是
int i;
class j
{
int x
}
j obj;
obj = new j;
i是存在于堆栈中,而obj是一个引用类型存在于堆中
那么<obj所引用的实例中的变量x是存在于哪里的呢?>
是作为预定义类型存在于堆栈中,还是作为引用类型
存在于堆中?

如果在堆栈中,那么基本上所有的类最开始大多数都
是由这些预定义的类型构成,如果在堆中,那么在c#里
所有的预定义类型的变量都是类的一部分,把什么放到
堆栈里?

谢谢


...全文
11 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
TheAres 2002-09-10
我来简单的探讨一下: 我说原理,最后你自己考虑考虑你的问题.
首先,你的例子有一个语法看起来不太舒服,
j obj;obj = new j;
改为j obj;obj = new j(),我们的csc会更高兴些.

首先,win32的管理内存空间是4GB,这4GB的空间称虚拟地址空间,简称虚拟内存,无论堆(heap)还是栈(stack),都在这里面.而我们的计算机一般没有这么大的内存,也不大可能用这么多的内存. 所以给他们做了一下划分,有一部分性能高的化出来,叫栈(stack),令一块叫堆(heap),性能低,但是能装的东西多.

说说值类型是如何放在栈(stack)的.
int i; double d; 计算机会在栈顶开辟4个存储单元,放i(不如是100-103,当然,绝对不是100,仅仅比如,后面都这样),然后有拿了8个来放d;

说说引用行的如何放在堆(heap)中的.
比如
class Class MyClass
{
int i;
double d;
}
MyClass myObj = new MyClass()
首先,windows要计算这个对象要占用的长度,比如,一个int 4 个字节,一个double要8个字节,还有一个要放这个对象多长,(一般是以32字节为最小分配单位),然后分配了一个32个字节的连续字节,比如是以1000开头.来放这个对象的内容. 虽然内容放好了,但是别人并不知道他在那儿,于是就要到栈(stack)上去,开4个字节(比如从160开始),来放这个100(堆(heap)的开始地址).以后有人使用myObj时候,先找160,然后找1000,就找到里面的内容了.

由于的堆(heap)还是栈(stack)原理和速度不同,所以才有了不同的存储方式.比如栈(stack)后来的先走,要想回收前面声明的变量,必须要先回收后面声明的. 要是所有的东西都放在栈里,恐怕不一会就占满了栈的空间. 而堆(heap)就没有这个限制,随时可以回收不用的东西,大不了你的堆(heap)的开始地址先放在栈中.


回复
comecsdn 2002-09-10
哪有下载?
回复
yarshray 2002-09-09
obj引用的实例中的变量x是放在受管制的堆中!
关于这一点你可以详细查看<<C#高级编程>>的第三章!
该书到处都有下载!
回复
saucer 2002-09-09
"obj所引用的实例中的变量x是存在于哪里的呢?"
on the managed heap
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2002-09-09 11:28
社区公告

让您成为最强悍的C#开发者