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。你缺少一种语言