【问题标题】:Static Variables assigned to Heap or Stack in C#? [closed]在 C# 中分配给堆或堆栈的静态变量? [关闭]
【发布时间】:2017-04-30 11:49:05
【问题描述】:

有两种类型:

第一个是存储在堆栈中的值类型,第二个是存储在堆中的引用类型。

现在如果我们有一个静态变量,假设:

static int a= 10;
static string str = "Question";

内存分配是如何完成的?

如果我们有一个结构体:

Struct struct
{
    int i;
    static string name;
    float f;
};

如何为这个结构分配内存?

【问题讨论】:

  • AFAIK 变量是静态的这一事实不应改变它在内存中的存储方式,因此整数将存储在堆栈中,而字符串则存储在堆中。
  • ... 存储在堆栈中的值类型对于初学者来说是不正确的。
  • 如果这不是重复的,请告诉我,其中一位 c# 语言设计师在这里解释了这一切:stackoverflow.com/q/40564712/495455
  • 静态变量通常存储在 loader heap 中,这是一个与 AppDomain 关联的内部 CLR 堆。抖动从中分配,当 AppDomain 被卸载时它们会死掉。很多讨厌的小细节,比如 [ThreadStatic] 和泛型类型的静态成员变量。它的设计让您永远不必担心它。
  • 附带说明,提问时请多加小心。例如,无需发送垃圾邮件问号。如果您表明您已将一些您的时间和精力用于您的问题,那么您的问题将更有机会得到捐赠他们的时间和精力的人的回答。

标签: c# memory-management struct


【解决方案1】:

第一个是存储在堆栈中的值类型,第二个是存储在堆中的引用类型。

这是一个经常重复的陈述,但事实并非如此。变量的存储方式是“实现细节”。

语言规范不能完全避免引用类型的实例存储在堆上的事实,但是对于局部变量,无论是值类型还是对实例的引用,情况都不是那么简单。

 class A { int b; }  // int b is of a value-type but will always live on the Heap

 void M() { int a, b; ... x => a+1; ... }  // a stored different from b

并没有真正指定static 字段的存储方式。它也与 C# 程序员无关。

实际上它们存储在一个静态段中,它既不是堆栈也不是堆。但我认为它们实际上是作为类型的一部分在堆上分配的。在运行时之间可能会有所不同的实现细节。

【讨论】:

  • 并没有真正指定静态字段的存储方式。它也与 C# 程序员无关。确实很重要....如果您正确理解了 GC 功能... GC 识别哪个对象未使用,需要使用根进行垃圾收集... 当 CLR 遇到静态对象(类成员、变量或事件),它创建了这个对象的一个​​全局实例。该对象可以在整个应用生命周期内访问,因此几乎从不收集静态对象。
  • 是的,静态引用变量是 GC 的根,但这与它们的存储方式无关。输入 static 是 C# 程序员的全部。
【解决方案2】:

静态与内存分配无关,静态只是表示无需创建实例即可访问该字段。

string 是引用类型,因此无论是静态字段还是非静态字段,都会在堆上分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2012-12-23
    • 2011-04-28
    • 1970-01-01
    • 2012-11-05
    • 2020-03-30
    相关资源
    最近更新 更多