64.C#临时变量的内存位置

  1. 64.CSharp函数中临时变量的内存分配
    1. 64.1 题目
    2. 64.2 深入解析
    3. 64.3 答题示例
    4. 64.4 关键词联想

64.CSharp函数中临时变量的内存分配


64.1 题目

C#函数中一般会声明一些临时变量,当函数被加载内存中后,所占的内存空间是否包含函数中的这些临时变量?


64.2 深入解析

不会包含。函数代码加载时只占代码段/元数据;临时变量在每次调用时随栈帧分配:值类型与引用类型的引用一般在栈(或寄存器)上;new 出的对象仍在托管堆上。

  • 栈帧随调用结束弹出,局部槽失效;堆上的对象由 GC 回收。

代码示例

public void ExampleFunction()
{
    int tempValue = 10; // 值类型,分配在栈上
    object tempObject = new object(); // 引用类型,引用分配在栈上,实际对象分配在堆上
    
    // 临时变量在函数执行期间占用内存
    // 当函数执行完毕后,这些变量将被销毁,释放内存
}

在上述示例中,tempValue 是一个值类型变量,分配在栈上。而 tempObject 是一个引用类型变量,它的引用分配在栈上,而实际的对象分配在堆上。函数执行完毕后,栈上的变量会被销毁,堆上的对象由GC进行垃圾回收。


64.3 答题示例

“函数被加载到内存时,仅包含元数据(如IL指令、参数签名等),并不包含临时变量的内存空间。这些临时变量是在函数执行时动态分配的:值类型变量(如int)直接在栈上分配,函数返回后自动释放;引用类型变量的引用(指针)在栈上分配,而实际对象在堆上创建,由GC回收。例如,当调用ExampleFunction时,tempValuetempObject的引用会在栈帧中创建,对象实例在堆上分配;函数执行结束后,栈帧弹出,tempValue和引用被销毁,但堆上的对象需等待GC标记回收。”


64.4 关键词联想

  • 栈(Stack)与堆(Heap)
  • 函数调用栈帧(Stack Frame)
  • 值类型 vs 引用类型
  • 垃圾回收(GC)机制
  • 内存生命周期
  • IL(中间语言)与JIT编译
  • 栈溢出(StackOverflowException)
  • 元数据(MethodInfo)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏