首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构值类型

结构值类型
EN

Stack Overflow用户
提问于 2010-12-13 23:07:54
回答 5查看 711关注 0票数 3

我知道struct是一个值类型,这意味着它是在堆栈上定义的。

但我可以做A a= new A();(当然,A是我的结构)。它定义在堆上,只有引用变量在堆栈上。

你能给我解释一下这个吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-13 23:19:05

值类型有时存储在堆栈中。这是一个复杂的主题,通常变量(堆栈或堆)的确切存储与编程问题无关。值类型和引用类型之间的真正区别在于它们的行为(例如,值类型总是按值复制的)。

Eric Lippert详细介绍了这个问题:

  • http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx
  • http://blogs.msdn.com/b/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx
  • http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx
票数 4
EN

Stack Overflow用户

发布于 2010-12-13 23:35:52

局部变量的存储位置是实现细节。

简单的局部变量通常存储在CPU寄存器和/或堆栈中。

如果它们在闭包中被捕获,它们将被重写为堆分配对象中的成员。这是因为lamda可能比它创建函数的时间更长,因此它使用的变量也必须能够生存足够长的时间。

与C#中的C++不同,new 并不隐含堆分配。这只是调用构造函数的语法。

而且,在值类型上调用new也不具有放置新的语义。它的语义是在某个地方构造一个实例,然后将其复制到目标变量中。

在我的心理模型中,有两种类型的存储:

不能超过函数返回时间的

  1. 本地存储。这包括堆栈和registers.
  2. Global存储,它们一直存在到不再被引用为止。这通常是堆。但是,在进行转义分析的运行时中,如果运行时证明没有引用会在函数中幸存下来,则可能会将其放入堆栈。

您的示例属于第一类存储,因为您使用的是值类型。

票数 2
EN

Stack Overflow用户

发布于 2010-12-13 23:12:10

您的代码(A a= new A();)创建并初始化结构。如果它是局部变量,则在堆栈上进行初始化。如果它是成员变量,则在堆上将其作为对象的一部分进行初始化。在C#/.NET中使用"new“并不一定意味着堆分配,它取决于上下文。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4430190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档