.NET:栈的生长与消亡

背景

多数情况下我们不需要关心栈的变化,不过个别场景下还是需要对此有所了解,如:指针操作,下文会给出一个具体的示例。另外,理解栈的变化对于理解作用域也有一定的好处,因为C#的局部变量作用域是基于栈的。

栈的变化规则

  • 方法调用会导致栈的生长,具体包括两个步骤:一、插入方法返回地址(下图中的Fn:);二、将实际参数按值(可以使用ref或out修饰)拷贝并插入到栈中(可以使用虚参数访问)。
  • 遇到局部变量定义会向栈中插入局部变量。
  • 遇到return语句会导致栈消亡,一直消亡到方法返回地址,并把return的返回值设置到方法返回地址中。
  • 这里先不考虑中括号导致的栈的消亡。

简单的示例

最后的小测试,输出的啥内容?

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace StackAndHeapStudy
 8 {
 9     unsafe class Program
10     {
11         static void Main(string[] args)
12         {
13             var test = new TestClass();
14             SetX(test);
15             Console.WriteLine(*test.X);
16             Console.WriteLine(*test.X);
17         }
18 
19         private static void SetX(TestClass test)
20         {
21             var X = 10;
22 
23             test.X = &X;
24         }
25     }
26 
27     unsafe class TestClass
28     {
29         public int* X;
30     }
31 }

备注

上大学期间学习过C++和C,此文只是靠回忆而写的,不一定正确,也希望兄弟们多批评。

 

posted on 2013-06-13 23:17  幸福框架  阅读(1297)  评论(2编辑  收藏  举报

导航

我要啦免费统计