5

您好,我想弄清楚它是如何工作的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"?堆栈帧将如何创建?

4

1 回答 1

6

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

避免这种情况的主要原因是它使堆栈溢出的可能性更大,并且很容易被粗心的程序员滥用。因此,C++ 标准委员会决定不采用C99 中的可变长度数组。alloca()是一个特定于平台的非标准函数,它甚至不是 POSIX 标准的一部分。

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

于 2018-05-17T08:29:59.550 回答