首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ValueType堆栈空间不足

ValueType堆栈空间不足
EN

Stack Overflow用户
提问于 2011-06-10 11:33:23
回答 1查看 259关注 0票数 4

我的理解是,.Net中的每个新线程都会分配1MB of stack space。此外,我的理解是,值类型存储在堆栈中,而不是堆中……

所以我的问题是:这种行为是否意味着任何ValueType变量声明都被限制在1MB的存储空间内?在当前作用域中声明的ValueTypes越多,调用堆栈实际上就越小,这是否意味着声明~260,000个in会占用所有的堆栈空间?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-10 12:37:39

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

但是,如果你想知道你是否真的可以拥有1MB的局部变量呢?正如其他人指出的,这是实现细节,结果可能会因平台、编译器版本、供应商等而有所不同。

让我们自己测试一下,看看什么是可能的,什么是不可能的。我在一台装有VS2010和C# 4.0编译器的x64机器上。

下面是我的代码:

代码语言:javascript
运行
复制
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的局部变量,你很可能做错了什么。但如果你想知道的话...现在你知道了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6301703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档