您好我想知道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-time
或precompile-time
(macros
等等)数组的大小是不是完全重点?C#如何?管理这个"magic"
?如何创建堆栈框架?
答案 0 :(得分:5)
“在堆栈上分配”基本上意味着将堆栈的头部移动远离当前函数的堆栈帧的基础。通常它是一个固定的数量 - 一些局部变量的大小 - 但没有什么能阻止你的程序将堆栈头移动一个可变量,由一个参数决定。
避免这种情况的主要原因是它使堆栈溢出的可能性更大,并且很容易被粗心的程序员滥用。因此,C ++标准委员会decided not to adopt variable-length arrays就像在C99中一样。 alloca()
是一个特定于平台的非标准函数,它甚至不是POSIX标准的一部分。
编辑:正如@PauloMorgado指出的那样,在C#中还有一个额外的考虑因素:堆栈上的分配不受垃圾收集的影响,而不是堆上的分配,这可能会激励使用{{尽管存在风险,但在C#中也是如此。