为何C#中"is Type"会分配内存,"is Type variable"却不会?
这是预期行为,根源在于两种
is写法的底层实现逻辑差异 1. thing is MyStruct产生24字节分配的原因
你的泛型方法Meow<T>约束T实现IInterface,当T为值类型MyStruct时,执行thing is MyStruct的底层逻辑是:
- CLR需要验证
thing的实际类型是否为MyStruct,但由于泛型参数带接口约束,此处会触发装箱操作——把值类型的thing装箱为IInterface引用类型对象。 - 64位系统下,CLR分配的最小对象大小为24字节(16字节对象头+8字节对齐,即便你的
MyStruct是空结构),这就是你看到的24字节内存分配的来源。
2. thing is MyStruct meow无内存分配的原因
这种带变量声明的模式匹配是C# 7.0引入的特性,编译器针对该场景做了定向优化:
- 编译器可直接识别泛型参数
T的实际类型为MyStruct(值类型),无需装箱,直接完成类型检查并将thing的值拷贝到新声明的meow变量中。 - 整个过程未涉及引用类型对象的分配,因此
GC.GetTotalAllocatedBytes测量的内存变化为0。
关于GC.GetTotalAllocatedBytes的使用
你对该API的使用是正确的:传入true会强制触发一次垃圾回收,确保测量的内存变化仅来自测试的is操作,排除了其他后台分配的干扰,结果可信。
内容的提问来源于stack exchange,提问作者Trisibo
相关产品推荐
相关产品推荐

