stackalloc 是 C# 中在栈上分配未托管内存的关键字,需 unsafe 上下文,仅限局部变量、编译期或受控运行时长度,推荐配合 Span 使用以提升安全性和易用性。

stackalloc 是 C# 中用于在栈上直接分配未托管内存的关键字,只能在 unsafe 上下文中使用,常用于高性能场景(如临时缓冲区、避免 GC 压力)。它分配的是**原始字节块**,不调用构造函数,也不受垃圾回收管理。
基本语法和使用前提
必须满足三个条件才能用 stackalloc:
- 方法必须标记为 unsafe
- 只能在局部变量声明中使用(不能用于字段、属性或返回值)
- 数组长度必须是编译期可确定的常量或 const 表达式(C# 7.2+ 支持运行时长度,但需满足栈空间安全限制)
基础用法示例(C# 7.2 之前)
分配固定大小的 int 数组:
unsafe {int* buffer = stackalloc int[256]; // 分配 256 个 int,约 1KB
buffer[0] = 42;
buffer[255] = 99;
}
C# 7.2+ 支持运行时长度(需谨慎)
允许用局部变量指定长度,但编译器会检查是否可能溢出栈(默认线程栈约 1MB,递归深时风险高):
unsafe {int length = ComputeBufferSize(); // 比如 1024
if (length > 1024 * 1024 / sizeof(int)) throw new InvalidOperationException("太大");
int* ptr = stackalloc int[length];
}
配合 Span 更安全易用
推荐搭配 Span
Span
temp.Fill(0xFF); // 安全写入
Console.WriteLine(temp.Length); // 输出 4096
}
注意:Span 本身不延长生命周期,stackalloc 分配的内存随作用域结束自动释放,无需手动清理。
基本上就这些。关键点是:只在真正需要低延迟/零 GC 的地方用,优先考虑 Span










