使用运算符“new”声明值类型

时间:2013-01-24 22:26:45

标签: c#

据说值类型存储在堆栈中。但是当我们使用new声明值类型时会发生什么? 例如

  

int a;

存储在堆栈中,但

  

int b = new int();

b存储在哪里?堆还是堆?这让我很困惑。它就像一个引用,但它是一个值类型。

2 个答案:

答案 0 :(得分:13)

  

据说值类型存储在堆栈

这经常说,但显然是假的。当你创建一个100个整数的数组时,那些内存是存在于堆栈还是堆上?

存储的生命周期与存储类型有关的想法简直就是错误的。正确的说法是,值类型的变量具有已知的短寿命,可以从短期存储中分配,当你这样说时,这听起来很明显。

确保你清楚:int i;意味着“在堆栈上分配i”,这简直是假的。这意味着“为我分配存储”;如果已知存储寿命很短,则可以在短期存储中分配。否则,它将在长期商店中分配。

  

但是当我们用new声明一个值类型时会发生什么?

您认为“新”会导致从堆中分配新存储。它不是。将“new”视为“获取存储然后调用构造函数”的含义。

为类类型获取的存储始终在堆上,因为不知道类数据的生命周期很短。为值类型获取的存储记录为在堆栈上,然后将值复制到其最终目标,该目标可能位于堆栈或堆上。但是,如果编译器可以确定安全,则可以复制分配和复制。

以下是一些有用的文章:

http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

http://blogs.msdn.com/b/ericlippert/archive/2010/10/11/debunking-another-myth-about-value-types.aspx

答案 1 :(得分:9)

堆栈或堆,这是一个实现细节。你实际上并不能保证即使int只会在堆栈上 - 运行时也可以决定在堆上分配任何值类型,如果它认为它在性能方面会更好。

您可以在Eric Lippert的 blog

上阅读
相关问题