我知道struct是一个值类型,这意味着它是在堆栈上定义的。
但我可以做A a= new A();(当然,A是我的结构)。它定义在堆上,只有引用变量在堆栈上。
你能给我解释一下这个吗?
发布于 2010-12-13 23:19:05
值类型有时存储在堆栈中。这是一个复杂的主题,通常变量(堆栈或堆)的确切存储与编程问题无关。值类型和引用类型之间的真正区别在于它们的行为(例如,值类型总是按值复制的)。
Eric Lippert详细介绍了这个问题:
发布于 2010-12-13 23:35:52
局部变量的存储位置是实现细节。
简单的局部变量通常存储在CPU寄存器和/或堆栈中。
如果它们在闭包中被捕获,它们将被重写为堆分配对象中的成员。这是因为lamda可能比它创建函数的时间更长,因此它使用的变量也必须能够生存足够长的时间。
与C#中的C++不同,new 并不隐含堆分配。这只是调用构造函数的语法。
而且,在值类型上调用new也不具有放置新的语义。它的语义是在某个地方构造一个实例,然后将其复制到目标变量中。
在我的心理模型中,有两种类型的存储:
不能超过函数返回时间的
您的示例属于第一类存储,因为您使用的是值类型。
发布于 2010-12-13 23:12:10
您的代码(A a= new A();)创建并初始化结构。如果它是局部变量,则在堆栈上进行初始化。如果它是成员变量,则在堆上将其作为对象的一部分进行初始化。在C#/.NET中使用"new“并不一定意味着堆分配,它取决于上下文。
https://stackoverflow.com/questions/4430190
复制相似问题