堆上的结构? [复制]

Posted

技术标签:

【中文标题】堆上的结构? [复制]【英文标题】:Struct on the heap? [duplicate] 【发布时间】:2014-08-14 02:10:42 【问题描述】:

所以我有这个:

class SimpleDateStructureDemo


  struct Date
  
    public int year;
    public int month;
    public int day;
  

  static void Main()
  
    ...
  


然后我看到一个例子,说对象是在堆上分配的:

Date dateMoonWalk = new Date();

我认为类是引用类型,结构是值类型。最后,你可以只使用new在堆上创建一个struct类型的对象,对吧?

【问题讨论】:

你有没有考虑过缩进你的代码?此外,当您引用您看到或阅读的内容时,引用/链接到它通常是有意义的,因此可以与您的问题一起评估。 当你说“堆”是什么意思? (我知道这意味着什么,我想知道你认为这意味着什么)以及你为什么关心你的对象是分配在堆上、状态上还是重新分配到 CPU 中。 必读:blogs.msdn.com/b/ericlippert/archive/2010/09/30/… ***.com/questions/4853213/… , ***.com/questions/203695/… , ***.com/questions/5563774/… Jon Skeet 对这个问题的回答(6 年前)长达 3 页,这一事实应该会提示您,这比您想象的要复杂得多,而且几乎可以肯定与不再是日常开发者 【参考方案1】:

你可以只使用 new 在堆上创建一个结构类型对象,对吧?

不,如果您在Main 内执行此操作,通常不会在堆上分配。不过,您可以通过多种方式在堆上分配结构,包括将其用作类中的字段、在闭包中使用等。

new Date 语法只是将结构初始化为它的默认(归零)值,但实际上并没有改变它的分配方式或位置。

【讨论】:

我不知道“你可以在堆上分配一个结构”是不是一个准确的描述。也许结构体是在堆栈上(或在寄存器中)分配的,然后装箱到堆中。【参考方案2】:

new 在这种情况下与堆上的分配无关

new 运算符还用于值类型调用默认构造函数

http://msdn.microsoft.com/en-us/library/fa0ab757.aspx

【讨论】:

new 在任何情况下都与堆上的分配无关。 @PrestonGuillot 那么您认为在哪里创建了引用类型实例?顺便说一句,我的意思是 托管 堆。 我来自 c++ 背景,其中 new 基本上与堆相关联...这就是为什么我认为它的工作原理相同

以上是关于堆上的结构? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C ++标准是否允许复制任意多态数据结构?

为啥要在堆上而不是栈上分配内存? [复制]

当由另一个在堆上分配的对象创建时,对象在哪里分配? [复制]

.net 笔试面试总结

为啥 Java 使用堆来分配内存? [复制]

strcpy 与 strdup