欢迎各界计算机爱好者加入,弘扬极客精神!

C#中栈和堆是如何定义的?

0 喜欢 0 不喜欢

如题

最新提问 9月 5, 2016 分类:C# | 用户: 多肉肉肉 (3,456 分)  

4 个回答

0 喜欢 0 不喜欢
 
已采纳

栈当中存放的是值类型,如int,decimal,double,enum等

堆当中存放的是引用类型,如string,类等

如果int = 5

那么在内存中的实际情况是:直接在栈中存放i的值5.

 

如果顶一个string类型的变量s:

string s = "A string.";
那么在内存中的实际情况是:在堆中存放s的变量名(即地址),在栈中存放s的值"A string.",然后让堆中的变量名s(即地址)指向栈中的值,这也是为什么,保存在堆中的变量被称为引用类型,因为当你访问一个引用类型的变量时,首先是访问它的地址,然后通过引用才能访问到该变量的值。

最新回答 9月 5, 2016 用户: xrrrrr (5,504 分)  
采纳于 9月 5, 2016 用户:多肉肉肉
1 喜欢 0 不喜欢
1、堆(heap):
定义:内存中存储的是固定长度的数据区域。
 
堆是从下往上分配,所以已用的空间在自由空间下面,C#中所有引用类型的对象分配在托管堆上,托管堆在内存上是连续分配的,并且内存对象的释放受垃圾收集机制的管理,效率相对于栈来说要低的多。
 
2、栈(stack):
定义:内存中存储的是可变长度的数据区域。
 
栈是自上向下进行填充,即由高内存地址指向低内存地址,并且内存分配是连续的,C#中所有的值类型和引用类型的引用都分配在栈上,栈根据后进先出的原则,依次对分配和释放内存对象。
3、相关说明:
1)栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2)堆区(heap) —一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
最新回答 9月 5, 2016 用户: 多肉肉肉 (3,456 分)  
0 喜欢 0 不喜欢
栈是编译期间就分配好的内存空间,堆是程序运行期间动态分配的内存空间。
最新回答 9月 5, 2016 用户: die when I am 27 (4,106 分)  
0 喜欢 0 不喜欢
...