Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用堆栈内存?_C#_Memory Management_Stack - Fatal编程技术网

C# 如何使用堆栈内存?

C# 如何使用堆栈内存?,c#,memory-management,stack,C#,Memory Management,Stack,在堆栈中,内存可以以后进先出的方式存储 我会给你举个例子来清楚地解释我的问题 public static void main() { int i=0; char ch='a'; string s="doubt"; } 在上面的示例中,第一个堆栈存储“i”值,在该堆栈的顶部存储“ch”值,在该“s”值的顶部存储。现在的问题是,如果我想使用“I”值,它怎么能被弹出。如果它弹出所有变量以获取int“i”值,“s”和“ch”值在哪里,则可以存储这些变量,实现通常将源代码编译为某些字节码。实

在堆栈中,内存可以以后进先出的方式存储 我会给你举个例子来清楚地解释我的问题

public static void main()
{
  int i=0;
  char ch='a';
  string s="doubt";
}
在上面的示例中,第一个堆栈存储“i”值,在该堆栈的顶部存储“ch”值,在该“s”值的顶部存储。现在的问题是,如果我想使用“I”值,它怎么能被弹出。如果它弹出所有变量以获取int“i”值,“s”和“ch”值在哪里,则可以存储这些变量,实现通常将源代码编译为某些字节码。实现编译为,即字节码调用

JVM用于基于堆栈的机器。CIL字节码也是。因此,JVM和CIL字节码都针对一些字节码(但针对Java-i.JVM-和C#-i.CIL-的字节码不同)

编译器将计算局部变量集,并生成适当的指令来处理当前帧

从概念上讲,局部变量的槽(在当前调用帧中)在控制流退出声明时弹出(但实际上发生的是实现细节)。了解。因此,您不需要显式地弹出任何值(编译器负责嵌套范围和局部变量)

通常,在中的调用期间(在调用堆栈上)推送调用帧,并在(相应的)函数尾声中(从调用堆栈)弹出调用帧,但细节取决于

JVM和CIL都需要一个。它将扫描堆栈上的指针(指向对象)(在您的示例中为
s

顺便说一句,Java有一些工具(不适合新手)可以访问调用堆栈。看见C#(和CIL)也提供了。还可以阅读关于

调用堆栈确实是一个遵循规则的过程,但是pull和pop操作是调用协议的一部分,并且是编译器生成的,因此保持隐式。在调用期间,在调用堆栈上推送一个新的调用帧。返回时,它会从调用堆栈中弹出。还可以阅读以下内容(然后在通话时,新的通话框将替换当前的通话框);遗憾的是,JVM通常不支持尾部调用

我推荐阅读一些章节来解释这些概念。这是一本优秀的免费编程入门书(它不使用Java或C作为编程语言)。

实现通常将源代码编译成某些字节码。实现编译为,即字节码调用

JVM用于基于堆栈的机器。CIL字节码也是。因此,JVM和CIL字节码都针对一些字节码(但针对Java-i.JVM-和C#-i.CIL-的字节码不同)

编译器将计算局部变量集,并生成适当的指令来处理当前帧

从概念上讲,局部变量的槽(在当前调用帧中)在控制流退出声明时弹出(但实际上发生的是实现细节)。了解。因此,您不需要显式地弹出任何值(编译器负责嵌套范围和局部变量)

通常,在中的调用期间(在调用堆栈上)推送调用帧,并在(相应的)函数尾声中(从调用堆栈)弹出调用帧,但细节取决于

JVM和CIL都需要一个。它将扫描堆栈上的指针(指向对象)(在您的示例中为
s

顺便说一句,Java有一些工具(不适合新手)可以访问调用堆栈。看见C#(和CIL)也提供了。还可以阅读关于

调用堆栈确实是一个遵循规则的过程,但是pull和pop操作是调用协议的一部分,并且是编译器生成的,因此保持隐式。在调用期间,在调用堆栈上推送一个新的调用帧。返回时,它会从调用堆栈中弹出。还可以阅读以下内容(然后在通话时,新的通话框将替换当前的通话框);遗憾的是,JVM通常不支持尾部调用

我推荐阅读一些章节来解释这些概念。这是一个优秀的免费编程入门(它不使用Java或C#作为编程语言)

在上面的示例中,第一个堆栈存储“i”值,在该堆栈的顶部存储“ch”值,在该“s”值的顶部存储

对。请注意,您没有说“推”,这是不正确的

现在的问题是,如果我想使用“i”值,它怎么能被弹出

它不是“弹出的”。它是通过当前堆栈帧基的索引访问的

如果弹出所有变量以获取int“i”值

没有

可以存储的“s”和“ch”值在哪里

在堆栈上,或者更好地在当前堆栈帧中

您应该将堆栈视为堆栈帧的堆栈,每个方法调用一个,而不是值堆栈

在上面的示例中,第一个堆栈存储“i”值,在该堆栈的顶部存储“ch”值,在该“s”值的顶部存储

对。请注意,您没有说“推”,这是不正确的

现在的问题是,如果我想使用“i”值,它怎么能被弹出

它不是“弹出的”。它是通过当前堆栈帧基的索引访问的

如果弹出所有变量以获取int“i”值

没有

可以存储的“s”和“ch”值在哪里

在堆栈上,或者更好地在当前堆栈帧中


您应该将堆栈视为堆栈帧的堆栈,每个方法调用一个堆栈帧,而不是值堆栈。

欢迎使用。您缺少语言标记(如果您想到Java,请添加
Java
标记)。因此,请编辑您的问题以改进它(至少,为某些特定编程语言添加适当的标记)。还可以阅读关于…好的,谢谢你,巴兹勒·斯塔林克维奇,欢迎来到SO。你缺少一种语言