堆栈分配如何工作?

How does stackalloc work?

你好,我想弄清楚 stackalloc work.So 是如何从 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" 吗?如何创建堆栈框架?

"Allocating on the stack" 基本上意味着将堆栈的头部从当前函数的堆栈帧的底部移开。通常它是一个固定的数量——一些局部变量的大小——但是没有什么能阻止你的程序将栈头移动一个可变的数量,由一个参数决定。

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

编辑: 正如@PauloMorgado 指出的那样,C# 中还有一个额外的注意事项:堆栈上的分配不受垃圾回收的影响,这与堆上的分配相反,后者尽管存在风险,但可能会激励在 C# 中使用 stackalloc()