You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

垃圾回收器会在调用期间移动结构体吗?结构体Span使用安全性问询

结构体内部使用Span的安全性分析

你的写法完全安全,不需要额外使用fixed块,原因如下:

  1. 值类型实例的内存稳定性
    结构体是值类型,当索引器执行时,this指向的实例内存位置在整个索引器调用周期内是固定的:

    • 如果实例在栈上,栈内存不会被GC移动;
    • 如果实例是装箱后的引用类型实例,GC在方法执行期间不会移动对象(GC只会在暂停所有线程时进行内存整理);
    • 即使实例作为ref/in参数传递,其内存位置也会被固定,不会在方法执行时变动。
  2. Span的生命周期限制
    UnsafeValues是一个即时计算的属性,每次访问都会通过MemoryMarshal.CreateSpan生成新的Span,而非缓存复用。在索引器的get/set逻辑中,这个Span的生命周期严格局限于当前调用过程,不会被保存到外部或字段中,自然不存在悬空引用的风险。

  3. 公开Span的风险本质
    你担心的公开UnsafeValues会出问题,核心原因是外部代码可能缓存这个Span,之后结构体实例被复制(值类型的复制会产生新的内存实例)或内存被移动,导致缓存的Span指向无效地址。但在私有内部使用时,不存在这种缓存场景,因此完全规避了风险。

总结:当前代码的设计是安全的,无需修改。

内容的提问来源于stack exchange,提问作者zstewart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:08:13