参看以下代码片断,选正确的表述项目:( ) (选1项)
String myStr=”Tom”;
string yourStr=”Jerry”;
A)myStr会保存在堆栈中,yourStr会保存在堆中
B)myStr会保存在堆中,yourStr会保存在堆栈中
C)myStr与yourStr都会保存在堆栈中
D)myStr与yourStr都会保存在堆中网上答案是B ,有几个问题不明白,请大家帮忙分析下:
1.这里说的堆栈是指栈还是指堆和栈2部分
2.C#中的堆栈和计算机系统中的堆栈是否相同
3.据介绍string对应的就是String 只不过做了封装处理看起来和值类型相似,那么为什么string就存在了堆栈了??
4.引用类型到底是只存在于堆中 还是堆栈中?
String myStr=”Tom”;
string yourStr=”Jerry”;
A)myStr会保存在堆栈中,yourStr会保存在堆中
B)myStr会保存在堆中,yourStr会保存在堆栈中
C)myStr与yourStr都会保存在堆栈中
D)myStr与yourStr都会保存在堆中网上答案是B ,有几个问题不明白,请大家帮忙分析下:
1.这里说的堆栈是指栈还是指堆和栈2部分
2.C#中的堆栈和计算机系统中的堆栈是否相同
3.据介绍string对应的就是String 只不过做了封装处理看起来和值类型相似,那么为什么string就存在了堆栈了??
4.引用类型到底是只存在于堆中 还是堆栈中?
引用类型都保存在托管堆中。
堆:Heap
堆栈:Stack
2.C#中的堆栈和计算机系统中的堆栈是否相同C#中的堆栈就是Stack,就是计算机系统中的栈。
3.据介绍string对应的就是 String 只不过做了封装处理看起来和值类型相似,那么为什么string就存在了堆栈了??string 就是 Sytsem.String,是引用类型,保存在托管堆(Heap)中,不是在堆栈(Stack)中。4.引用类型到底是只存在于堆中 还是堆栈中?引用类型只存在于堆(Heap)中。
用c来描述就是
char *myStr = strdup("Tom");
char *yourStr = strdup("Jerry");
2.不相同 c#中的是托管堆栈
3.String 是通用类型系统CTS中的写法,string是C#中的类型对应的,翻译成MSIL就是String
4.引用类型 在栈中放引用在堆中放数据
堆也是一种数据结构,管理大片内存时使用(当然小片的也能管理),根据堆的用途不同,实现的数据结构也不同,实现的复杂程度也不同。(比如优先队列等)
堆栈是对这两种数据结构的称呼(我这么认为)一般表示保存在内存中的数据(内存中的大部分数据都是按照堆或者栈来保存的)。栈又叫做自动内存,有点像托管堆,它能自动分配自动释放,这是由操作系统保证的,操作系统在调用函数的时候会为函数分配栈空间,调用完之后会释放刚才分配的栈空间(由调用方释放还是被调方释放不同的平台有不同的实现),从而保证栈平衡。
堆在操作系统里面很常见,在.NET里面主要是托管堆,托管堆是由操作系统的堆分配器在某块儿连续的大内存区域划分出来的一片保留内存,CLR负责这个堆的管理工作。楼主的两个实例均分配在堆上,但是他们的引用保存在栈上(这是另外一个话题)。就你的问题来说这两个对象的实例是保存在托管堆上的,可以看下面的例子,以示证明:static void Main(string[] args) {{
string s1 = "abc";
String s2 = "cde";
}我们用windbg来调试这个程序:
首先我们可以知道(!eeheap -gc):当前这个.NET程序分配的托管堆从0x024d1018开始(0代的起始地址),其他代不列了。
其次我们可以从内存中找到这两个实例,他们的地址分别是:0x024dc018和0x024dc02c
最后我们可以打开地址0x024dc018和0x024dc02c,(!do add)可以看到这里确实保存的是类型为5a15d2b8的对象,该对象长度为3,内容分别是abc和cde。另外我们可以看到这里保存的托管类型是一样的,他们都是5a15d2b8。内存布局如下:0x024DC018 b8 d2 15 5a 03 00 00 00 ??.Z....
0x024DC020 61 00 62 00 63 00 00 00 a.b.c...
0x024DC028 00 00 00 80 b8 d2 15 5a ...€??.Z
0x024DC030 03 00 00 00 63 00 64 00 ....c.d.
0x024DC038 65 00 00 00 00 00 00 00 e.......个人理解,仅供参考。
引用类型都保存在托管堆中。
堆:Heap 也叫托管堆
堆栈:Stack 也叫栈
值类型与引用类型,可以到网上查下
CLR会在托管堆(Managed Heap)中分配内存快
一般的引用对象的创建是通过newobj这样一个IL指令来实现的,
而创建一个字符串变量的IL指令则是ldstr
CLR内部维护着一块特殊的数据结构—Hash table,Hash table维护大部分创建的string
堆栈指的肯定是 栈(stack),堆是heap。这个是老的计算机教材的翻译导致的。现在的教材基本上都不再使用堆栈来翻译stack。2.C#中的堆栈和计算机系统中的堆栈是否相同
完全相同3.据介绍string对应的就是String 只不过做了封装处理看起来和值类型相似,那么为什么string就存在了堆栈了?
string依然存放在堆中。
string只是String的别名。String是引用类型。所有的引用类型都存放在堆中。4.引用类型到底是只存在于堆中 还是堆栈中?
所有的引用类型都存放在堆中。
在这个层面你可以理解计算机的内存一般分为两部分,堆栈(一般也叫栈),堆(C#中托管堆),值类型数据一般直接在栈上创建并初始化,引用类型一般在栈上创建标签,在堆上保存数据,所以当你定义一个int数据时没有给其初始值,它也有一个初始值,而string就会为null,就是这个原因。
栈的速度相对快,而空间有限,堆反之。
至于如何使用,根据特性自己体会吧。
对于答案的解释 现整理于http://blog.csdn.net/shao5155285/archive/2010/05/18/5604970.aspx
首先 String和string没有任何区别 都是引用类型
题目问的是myStr和yourStr
"Tom"和"Jerry"保存在堆里没有错
可是myStr和yourStr这两个变量保存在栈里