【问题标题】:When would I need to use the stackalloc keyword in C#?什么时候需要在 C# 中使用 stackalloc 关键字?
【发布时间】:2009-04-06 12:49:03
【问题描述】:

stackalloc 关键字提供什么功能?我什么时候以及为什么要使用它?

【问题讨论】:

  • @Paul:我只是修改了问题以添加更多内容。您最初的措辞实际上没有任何问题。
  • 有人可以说明何时有人需要在答案中使用不安全的操作吗?

标签: c# keyword stackalloc


【解决方案1】:

来自MSDN

用于在不安全的代码上下文中分配内存块 堆栈。

C# 的主要特性之一是您通常不需要直接访问内存,就像在 C/C++ 中使用 mallocnew 所做的那样。但是,如果你真的想显式分配一些内存,你可以,但 C# 认为这是“不安全的”,所以你只能在编译时使用 unsafe 设置。 stackalloc 允许你分配这样的内存。

您几乎可以肯定不需要使用它来编写托管代码。在某些情况下,如果您直接访问内存,您可以编写更快的代码是可行的——它基本上允许您使用适合某些问题的指针操作。除非您遇到特定问题并且不安全的代码是唯一的解决方案,否则您将可能永远不需要这个。

【讨论】:

  • StackOverflow 的构建是为了让在互联网上搜索的人可以在这里找到答案(只需先问)。
  • 不幸的是,你听起来很粗鲁:) 也许这个人不明白在堆栈上分配内存与在堆上分配内存之间的区别。你的回答很明显,没有必要。
  • 亚当,我不一定同意。那时他可能会用不同的方式表达他的问题,例如“我什么时候需要使用 stackalloc 关键字?”。
  • 你的意思是这个问题的标题的确切措辞......?
  • “不是由 CLR 管理”——这是正确的,但很容易引起误解,因为它是在堆栈上分配的,它会在范围/方法的末尾自动被删除,并且不需要任何进一步的垃圾收藏。
【解决方案2】:

Stackalloc 会在栈上分配数据,可以用来避免在一个方法中重复创建和销毁值类型数组所产生的垃圾。

public unsafe void DoSomeStuff()
{
    byte* unmanaged = stackalloc byte[100];
    byte[] managed = new byte[100];

    //Do stuff with the arrays

    //When this method exits, the unmanaged array gets immediately destroyed.
    //The managed array no longer has any handles to it, so it will get 
    //cleaned up the next time the garbage collector runs.
    //In the mean-time, it is still consuming memory and adding to the list of crap
    //the garbage collector needs to keep track of. If you're doing XNA dev on the
    //Xbox 360, this can be especially bad.
}

【讨论】:

  • 请注意,由于转义分析,managed 无论如何都可能在堆栈上分配。
【解决方案3】:

保罗,

正如这里的每个人所说,该关键字指示运行时在堆栈而不是堆上分配。如果您对这意味着什么感兴趣,请查看this article

【讨论】:

    【解决方案4】:

    http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx

    此关键字用于处理不安全的内存操作。通过使用它,您可以使用指针(C/C++ 中一个强大而痛苦的特性)

    【讨论】:

      【解决方案5】:

      stackalloc 指示 .net 运行时在堆栈上分配内存。

      【讨论】:

        【解决方案6】:

        大多数其他答案都集中在 OP 问题的“什么功能”部分。
        我相信这将回答何时以及为什么:

        您什么时候需要这个?
        通过多个小数组的缓存局部性获得最佳的最坏情况性能。

        现在在普通应用程序中您不需要这个,但对于实时敏感的场景,它提供了更多确定性的性能:不涉及 GC,几乎可以保证缓存命中。
        (因为最坏情况下的性能比平均性能更重要。)

        请记住,.net 中的默认堆栈大小很小!
        (我认为普通应用程序为 1MB,ASP.net 为 256kb?)

        实际用途可能包括实时声音处理。

        【讨论】:

          【解决方案7】:

          就像史蒂夫指出的那样,只在不安全的代码上下文中使用(例如,当你想使用指针时)。

          如果您不在 C# 应用程序中使用不安全代码,那么您将永远需要它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-16
            • 1970-01-01
            • 2011-07-07
            • 2017-08-17
            • 2010-12-18
            相关资源
            最近更新 更多