zoukankan      html  css  js  c++  java
  • .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,此文只是靠回忆而写的,不一定正确,也希望兄弟们多批评。

  • 相关阅读:
    观察者模式
    vim7.4+python3配置
    GAN_李弘毅讲解
    关于Anaconda的环境和包管理
    inception v1-v3 & Xception
    python使用PDB进行调试
    python中“*”、"*args"、"kwargs"三种用法
    解决样本类别不平衡以及困难样本问题的方法总结
    Focal Loss
    RefineDet网络简介(转载)
  • 原文地址:https://www.cnblogs.com/happyframework/p/3134798.html
Copyright © 2011-2022 走看看