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