gpt4 book ai didi

c# - ValueType 堆栈空间用完

转载 作者:太空狗 更新时间:2023-10-30 01:25:46 26 4
gpt4 key购买 nike

我的理解是 .Net 中的每个新线程分配 1MB of stack space .我的进一步理解是值类型存储在堆栈而不是堆中......

所以我的问题是这样的;这种行为是否意味着任何 ValueType 变量声明都被限制为 1MB 的存储空间?您在当前范围内声明的 ValueTypes 越多,调用堆栈实际上可以越小,在某些时候这是否意味着声明(为了论证)~260,000 个整数会使用您所有的堆栈空间?

最佳答案

对于此类问题,最有效的答案通常是去测试。其他人告诉您您不必为此担心,他们有点是对的。所有链接的文章都很棒,值得一读。在大多数实际情况下,您不需要接近 1MB 的局部变量。

但是,如果您想知道天气情况,您实际上可以拥有 1MB 的局部变量吗?正如其他人指出的那样,这是实现细节,结果可能因平台、编译器版本、供应商等而异。

让我们自己测试一下,看看什么是可能的,什么不是。我在带有 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;
}
}
}

当我编译并运行这段代码时,出现堆栈溢出异常。这意味着至少在某些 情况下您确实受到堆栈空间的限制。这确实意味着您拥有的局部变量越多,留给方法调用、递归等的堆栈就越少。

再一次:这些考虑几乎不切实际。如果您分配 1MB 的局部变量,您很可能做错了什么。但万一你想知道……现在你知道了。

关于c# - ValueType 堆栈空间用完,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6301703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com