据说值类型存储在堆栈中。但是当我们用 声明一个值类型时会发生什么new
呢?例如
诠释一个;
存储在堆栈中,但是
诠释 b=新诠释();
b 存储在哪里?堆还是栈?这让我很困惑。它就像一个引用,但它是一个值类型。
据说值类型存储在堆栈中。但是当我们用 声明一个值类型时会发生什么new
呢?例如
诠释一个;
存储在堆栈中,但是
诠释 b=新诠释();
b 存储在哪里?堆还是栈?这让我很困惑。它就像一个引用,但它是一个值类型。
据说值类型存储在堆栈中
这是经常说的,但显然是错误的。当您创建一个包含 100 个整数的数组时,这些整数是位于堆栈还是堆中?
存储的生命周期与存储类型有关的想法是完全错误的。正确的说法是可以从 short-term storage 分配已知短生命周期的值类型变量,当您这样说时,这听起来很明显。
确保你清楚这一点:这int i;
意味着“在堆栈上分配 i”是错误的。意思是“为 i 分配存储空间”;如果已知该存储寿命很短,则可以在短期存储上分配它。否则,它会在长期存储中分配。
但是当我们用 new 声明一个值类型时会发生什么?
您认为“新”会导致从堆中分配新存储。它不是。将“new”视为“获取存储然后调用构造函数”的意思。
为类类型获得的存储总是在堆上,因为类数据的生命周期不知道是短的。为值类型获得的存储被记录为在堆栈上,然后将该值复制到其最终目的地,可能在堆栈或堆上。但是,如果编译器可以确定这样做是安全的,则可以复制省略该分配和复制。
这里有一些文章会有所帮助:
http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx
https://ericlippert.com/2010/10/11/debunking-another-myth-about-value-types/
堆栈或堆,这是一个实现细节。您实际上无法保证 evenint
只会在堆栈上 - 运行时可以决定在堆上分配任何值类型,如果它认为在性能方面会更好。
你可以在 Eric Lippert 的博客上阅读它