堆栈分配如何工作?
How does stackalloc work?
你好,我想弄清楚 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"
吗?如何创建堆栈框架?
"Allocating on the stack" 基本上意味着将堆栈的头部从当前函数的堆栈帧的底部移开。通常它是一个固定的数量——一些局部变量的大小——但是没有什么能阻止你的程序将栈头移动一个可变的数量,由一个参数决定。
避免这种情况的主要原因是它更容易发生堆栈溢出,并且很容易被粗心的程序员滥用。因此 C++ 标准委员会 decided not to adopt variable-length arrays 就像在 C99 中一样。 alloca()
是特定于平台的非标准函数,甚至不属于 POSIX 标准。
编辑: 正如@PauloMorgado 指出的那样,C# 中还有一个额外的注意事项:堆栈上的分配不受垃圾回收的影响,这与堆上的分配相反,后者尽管存在风险,但可能会激励在 C# 中使用 stackalloc()
。
你好,我想弄清楚 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"
吗?如何创建堆栈框架?
"Allocating on the stack" 基本上意味着将堆栈的头部从当前函数的堆栈帧的底部移开。通常它是一个固定的数量——一些局部变量的大小——但是没有什么能阻止你的程序将栈头移动一个可变的数量,由一个参数决定。
避免这种情况的主要原因是它更容易发生堆栈溢出,并且很容易被粗心的程序员滥用。因此 C++ 标准委员会 decided not to adopt variable-length arrays 就像在 C99 中一样。 alloca()
是特定于平台的非标准函数,甚至不属于 POSIX 标准。
编辑: 正如@PauloMorgado 指出的那样,C# 中还有一个额外的注意事项:堆栈上的分配不受垃圾回收的影响,这与堆上的分配相反,后者尽管存在风险,但可能会激励在 C# 中使用 stackalloc()
。