你好,我正在尝试从我的知识(有限的)中了解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-time或precompile-time (macros等)数组的大小吗? C#是如何管理这个"magic"的?如何创建堆栈帧?
发布于 2018-05-17 08:29:59
“在堆栈上分配”基本上意味着将堆栈的头部移离当前函数的堆栈框架的底部更远。通常情况下,它是由一个固定的数量(一些局部变量的大小)决定的,但是没有什么可以阻止您的程序以变量的数量移动堆栈头,这是由其中一个参数决定的。
避免这种情况的主要原因是它使堆栈溢出的可能性更大,并且很容易被粗心的程序员滥用。因此,C++标准委员会decided not to adopt variable-length arrays类似于C99。alloca()是一个特定于平台的非标准函数,它甚至不是POSIX标准的一部分.
编辑:( @PauloMorgado )指出,在C#中还有一个额外的考虑:堆栈上的分配不受垃圾收集的约束,而不是堆上的分配,尽管存在风险,但这可能会促使在C#中使用stackalloc()。
https://stackoverflow.com/questions/50385006
复制相似问题