每日一题:Span<T>和Memory<T>
每日一题SpanT和MemoryT参考答案在 .NET 中SpanT 和 MemoryT 是用于高性能内存操作的重要结构它们主要解决了 减少内存分配和提高数据处理效率的问题。SpanT 是一种表示 连续内存区域的轻量级结构ref struct。它可以指向数组、栈内存或非托管内存的一部分而不需要复制数据。例如一个 Spanbyte 可以表示数组中的某一段数据。SpanT 的主要特点包括不会分配新的内存可以安全地操作连续内存片段提高性能并减少 GC 压力由于 SpanT 是 ref struct它只能存在于 栈上因此不能被装箱、不能作为类字段也不能在 async 方法中使用。MemoryT 则是 SpanT 的 可堆分配版本。它可以存储在堆上并可以跨越异步方法或长期存储。当需要在异步操作或类成员中保存内存引用时通常使用 MemoryT。简单理解SpanT高性能、栈上、短生命周期MemoryT可在堆上存储、适合异步场景这两个类型在 高性能网络库、序列化框架、IO 处理等场景中非常常见。追问 1为什么 SpanT 不能在 async 方法中使用答案SpanT 是一种 ref struct 类型它只能存储在栈上而不能被移动到托管堆中。async 方法在编译后会被转换为 状态机对象该状态机通常存储在堆上以便在异步操作完成后恢复执行。如果 SpanT 能够跨越 await 存在就意味着它必须被存储在状态机对象中这会导致它被移动到堆上从而违反 SpanT 的设计规则。因此C# 编译器禁止 SpanT 在 async 方法中跨越 await 使用。这也是为什么在异步场景中通常使用 MemoryT 或 ReadOnlyMemoryT。追问 2为什么 SpanT 能提高性能答案SpanT 提高性能的主要原因是它 避免了额外的内存分配和数据复制。在传统代码中如果需要处理数组的一部分数据通常需要创建新的数组或使用 Array.Copy这会导致额外的内存分配。而 SpanT 只是对现有内存的一种 视图view它不会复制数据而是直接引用原始内存区域。因此程序可以在不分配新内存的情况下操作数据。此外减少内存分配也意味着 降低 GC 压力从而提高整体性能。这也是为什么在高性能库如网络框架、序列化库中广泛使用 SpanT。#面试题 #dotnet面试题 #面试真题