我对Stack vs Heap之间的内存分配基础感到困惑.按照标准定义(每个人都说的),所有Value Types个类型将被分配到StackReference个类型将被分配到Heap.

现在考虑下面的例子:

class MyClass
{
    int myInt = 0;    
    string myString = "Something";
}

class Program
{
    static void Main(string[] args)
    {
       MyClass m = new MyClass();
    }
}

那么,在c#中,内存分配将如何进行呢?MyClass(即m)的对象将完全分配给堆吗?也就是说,int myIntstring myString都将进入堆?

或者,对象将分为两部分,并将分配给两个内存位置,即堆栈和堆?

推荐答案

堆上分配了m,其中包括myInt.在堆栈上分配基元类型(和 struct )的情况是在方法调用期间,这为堆栈上的局部变量分配了空间(因为这样更快).例如:

class MyClass
{
    int myInt = 0;

    string myString = "Something";

    void Foo(int x, int y) {
       int rv = x + y + myInt;
       myInt = 2^rv;
    }
}

rvxy都将在堆栈上.myInt位于堆的某个位置(必须通过this指针访问).

.net相关问答推荐

Docker镜像mcr.microsoft.com/dotnet/aspnet:8.0不能在Windows上构建

获取Ef-Core集合的DeleteBehavior

在 WPF 窗口中获取当前聚焦的元素/控件

为什么递归调用会导致不同堆栈深度的 StackOverflow?

如何将自定义 UserControl 显示为对话框?

什么是 project.lock.json?

String 是原始类型吗?

参数命名:文件名还是文件名?

Double.TryParse 或 Convert.ToDouble - 哪个更快更安全?

.NET 的 String.Normalize 有什么作用?

当我们按下 Enter 键时启动的 WPF 文本框命令

mscorlib 代表什么?

Visual Studio 2017 和 2019 突出显示滚动条中所选单词的出现

.NET Framework SDK 和 Targeting 包有什么区别

用 double 替换 int 时的 Visual Studio 长编译

如何获得 Bin 路径?

功能说明

在 IIS 中访问 .svc 文件时出现 HTTP 404

WPF 中的 Application.DoEvents() 在哪里?

从 bcp 客户端接收到 colid 6 的无效列长度