c# - 下面的场景是如何分配内存的?我设法把它弄糊涂了

标签 c# memory-management stack clr heap-memory

我在下面提到了名称为 “Employee” 的属性类。

public class Employee
{
    public int EmpID { get; set; }
    public int DeptId { get; set; }
}

我们都知道"int"数据类型会存储在栈中,Object类型会存储在堆中,如下图所示。

enter image description here

我的问题是,当我要创建一个Employee类的对象时

Employee objEmployee = new Employee();

内存分配是如何完成的?

任何文献或相关链接将不胜感激。

最佳答案

We all know that "int" data type will be store in stack and Object type will be store in heap like as below snap.

因为那是完全错误的,我们都不知道

想想看:

int[] M() { return new int[] { 1 }; }

栈上是1吗?如果是,那么在 M 返回后如何从 M 的调用者访问它?

显然不可能。 1 在堆上,即使它是一个 int。

您的问题是您考虑的是值,而不是变量。变量就是存储,不管里面存储的是整数还是引用。该存储必须在某个地方。 存储位置取决于生命周期要求。短期存储可以从短期存储池(堆栈或寄存器)中分配。长期存储是从长期存储池——堆中分配的。它与存储的值是结构还是引用没有任何关系

在您的示例中,属性的后备存储可以任意长存,因此必须从堆中分配。

您需要停止相信值类型的值进入堆栈的神话。值进入存储存储在需要去的地方以满足其生命周期要求

关于c# - 下面的场景是如何分配内存的?我设法把它弄糊涂了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43361697/

相关文章:

c - 尝试访问 C 中释放的内存时没有警告

c - 如何修复与 C 中的动态数组指针/堆栈相关的崩溃?

c# - 一段时间后在 RabbitMQ 中获取 OutOfMemory

c# - NAudio - 从指定位置搜索和导航播放

c++ - 指向函数的指针怎么能指向内存中还不存在的东西呢?为什么原型(prototype)有不同的地址?

C++ 程序在重新执行时加速

c++ - 为什么在创建入栈函数时使用指向栈的指针?

python - 堆栈和优化 - 来自 hackerrank 的示例

c# - 通过 php 引用 .Net 函数的最佳方法

c# - 如何调用 AnimateWindow 函数来为外部窗口/进程设置动画