我的理解是.Net中的每个新线程都会分配1MB 堆栈空间 https://stackoverflow.com/questions/4088448/the-net-stack-vs-windows-stack。进一步我的理解是,值类型存储在堆栈上而不是堆上......
所以我的问题是这样的;此行为是否意味着任何 ValueType 变量声明都限制为 1MB 的存储空间?您在当前作用域中声明的 ValueType 越多,调用堆栈实际上就越小,这是否意味着在某些时候声明(为了论证)约 260,000 个整数将使用您的所有堆栈空间?
对这类问题最有效的答案通常是去测试。其他人告诉你,你不应该担心这个,他们是kind of正确的。所有链接的文章都很棒并且值得一读。在大多数实际情况下,您不需要接近 1MB 的局部变量。
但是如果你想知道你实际的天气怎么办can1MB 的局部变量值得吗?
正如其他人指出的那样,这是实现细节,结果可能会因平台、编译器版本、供应商等而异。
让我们自己测试一下,看看什么是可能的,什么是不可能的。我在一台带有 VS2010 和 C# 4.0 编译器的 x64 机器上。
这是我的代码:
using System;
namespace SO6301703
{
struct s64b
{
public long f1;
public long f2;
public long f3;
public long f4;
public long f5;
public long f6;
public long f7;
public long f8;
}
struct s256b
{
public s64b f1;
public s64b f2;
public s64b f3;
public s64b f4;
}
struct s1kb
{
public s256b f1;
public s256b f2;
public s256b f3;
public s256b f4;
}
struct s8kb
{
public s1kb f1;
public s1kb f2;
public s1kb f3;
public s1kb f4;
public s1kb f5;
public s1kb f6;
public s1kb f7;
public s1kb f8;
}
struct s64kb
{
public s8kb f1;
public s8kb f2;
public s8kb f3;
public s8kb f4;
public s8kb f5;
public s8kb f6;
public s8kb f7;
public s8kb f8;
}
struct s512kb
{
public s64kb f1;
public s64kb f2;
public s64kb f3;
public s64kb f4;
public s64kb f5;
public s64kb f6;
public s64kb f7;
public s64kb f8;
}
struct s1Mb
{
public s512kb f1;
public s512kb f2;
}
class Program
{
static void Main(string[] args)
{
unsafe { Console.WriteLine(sizeof(s1Mb)); }
s1Mb test;
}
}
}
当我编译并运行此代码时,我收到堆栈溢出异常。这意味着至少在some在这种情况下,您确实受到堆栈空间的限制。这确实意味着局部变量越多,留给方法调用、递归等的堆栈就越少。
再次强调:这些考虑几乎不切合实际。如果您分配了 1MB 的局部变量,那么您很可能做错了什么。但如果你想知道的话……现在你知道了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)