C#怎么使用stackalloc关键字 C#在栈上分配内存方法

15次阅读

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

C#怎么使用stackalloc关键字 C#在栈上分配内存方法

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 使用,避免裸指针,获得类型安全和边界检查(仅在运行时启用):

unsafe {
  Span temp = stackalloc byte[4096];
  temp.Fill(0xFF); // 安全写入
  console.WriteLine(temp.Length); // 输出 4096
}

注意:Span 本身不延长生命周期,stackalloc 分配的内存随作用域结束自动释放,无需手动清理。

基本上就这些。关键点是:只在真正需要低延迟/零 GC 的地方用,优先考虑 Span + stackalloc 而不是裸指针,长度务必可控,避免栈溢出。

text=ZqhQzanResources