stackalloc如何工作?

时间:2018-05-17 06:45:54

标签: c++ memory-management stackframe stackalloc c#-7.3

您好我想知道stackalloc是如何工作的。所以从我的知识(有限)来自C/C++你不能动态地在堆栈上分配内存,如下所示:

C/C++示例:

   void Allocate(int length){
     int vector[length];  //wont work
   }

然后C#发挥作用,您可以使用stackalloc

     void Allocate(int length){
      int []vector=stackalloc int [length];
     }

stack分配知道compile-timeprecompile-timemacros等等)数组的大小是不是完全重点?C#如何?管理这个"magic"?如何创建堆栈框架?

1 个答案:

答案 0 :(得分:5)

“在堆栈上分配”基本上意味着将堆栈的头部移动远离当前函数的堆栈帧的基础。通常它是一个固定的数量 - 一些局部变量的大小 - 但没有什么能阻止你的程序将堆栈头移动一个可变量,由一个参数决定。

避免这种情况的主要原因是它使堆栈溢出的可能性更大,并且很容易被粗心的程序员滥用。因此,C ++标准委员会decided not to adopt variable-length arrays就像在C99中一样。 alloca()是一个特定于平台的非标准函数,它甚至不是POSIX标准的一部分。

编辑:正如@PauloMorgado指出的那样,在C#中还有一个额外的考虑因素:堆栈上的分配不受垃圾收集的影响,而不是堆上的分配,这可能会激励使用{{尽管存在风险,但在C#中也是如此。