stackalloc是如何工作的?

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(栈) 的整个意义不就是要在编译时或预编译时(使用 macros 等)知道数组的大小吗?C# 是如何处理这种“魔法”的?栈帧将如何被创建?


6
实际上,在C++中,你可以使用alloca函数实现。 - Fantastic Mr Fox
2
你可能还想了解GCC如何实现可变长度数组。 - Angew is no longer proud of SO
2
顺便提一下,C99允许使用可变长度数组(即大小在运行时确定),C中还有alloca - Hasturkun
3
“动态”栈可以在方法的“固定”栈末尾分配(即在固定栈在该方法中最大大小的末尾处...可以计算出来)...所以没有问题。在IL语言(.NET的汇编语言)中有一条指令,maxstack,用于声明方法所使用的固定栈的最大大小。 - xanatos
2
@Kapil,可变长度数组不是C++标准的一部分。这种行为可能是由于非标准编译器扩展引起的,因此不具备可移植性。 - Fantastic Mr Fox
显示剩余4条评论
1个回答

7
"在栈上分配"基本上意味着将栈的头部从当前函数的堆栈帧的基础处进一步移开。通常是通过固定量——一些本地变量的大小——但没有什么阻止程序通过其中一个参数来移动堆栈头部的变量量。
避免这种情况的主要原因是它会增加栈溢出的可能性,并且容易被粗心的程序员滥用。因此,C++标准委员会决定不采用类似于C99中的可变长度数组。而alloca()是一个特定于平台的非标准函数,甚至不是POSIX标准的一部分。 编辑:正如@PauloMorgado所指出的,在C#中还有一个额外的考虑因素:在栈上分配的内存不受垃圾回收的影响,而在堆上分配的内存则可能促使使用stackalloc(),尽管存在风险。

3
在 C# 中,stackalloc 的具体风险是什么? - Paulo Morgado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接