zoukankan      html  css  js  c++  java
  • .NET:栈的生长与消亡.

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

  • 相关阅读:
    在线思维导图、UML
    SpringBoot定时任务
    SpringBoot邮件发送
    SpringBoot执行异步任务
    banner.txt
    SpringBoot Swagger3.0配置
    SpringBoot durid监控配置
    SpringBoot使用Shiro
    页面LOADING效果
    vue 阻止el-radio事件冒泡
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3135022.html
Copyright © 2011-2022 走看看