为了账号安全,请及时绑定邮箱和手机立即绑定

在结构上使用“new”在堆或堆栈上分配它吗?

在结构上使用“new”在堆或堆栈上分配它吗?

扬帆大鱼 2019-07-31 14:26:13
在结构上使用“new”在堆或堆栈上分配它吗?使用new运算符创建类的实例时,将在堆上分配内存。当您使用new运算符创建结构的实例时,在堆上还是堆栈上分配内存?
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

包含结构字段的内存可以在堆栈或堆上分配,具体取决于具体情况。如果struct-type变量是某个匿名委托或迭代器类未捕获的局部变量或参数,那么它将在堆栈上分配。如果变量是某个类的一部分,那么它将在堆上的类中分配。

如果在堆上分配结构,则实际上不需要调用new运算符来分配内存。唯一的目的是根据构造函数中的任何内容设置字段值。如果未调用构造函数,则所有字段都将获得其默认值(0或null)。

类似地,对于在堆栈上分配的结构,除了C#要求所有局部变量在使用之前设置为某个值,因此您必须调用自定义构造函数或默认构造函数(不带参数的构造函数始终可用于结构)。


查看完整回答
反对 回复 2019-07-31
?
茅侃侃

TA贡献1842条经验 获得超21个赞

简单地说,new是结构的用词不当,调用new只是调用构造函数。结构的唯一存储位置是它定义的位置。

如果它是一个成员变量,它将直接存储在它定义的任何内容中,如果它是局部变量或参数,则它存储在堆栈中。

将其与类对比,这些类在结构完整存储的任何地方都有引用,而引用指向堆上的某处。(堆栈中的本地/参数)

它可能有助于深入了解C ++,其中class / struct之间没有真正的区别。(在语言中有类似的名称,但它们只引用事物的默认可访问性)当您调用new时,您将获得指向堆位置的指针,而如果您有非指针引用,则它将直接存储在堆栈上或在另一个对象中,ala结构在C#中。


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 957 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信