Blittable_and_Non-Blittable_Typs
背景
在 C# / .Net 中,有两种内存环境
- 托管内存(Managed Memory)
由 CLR (Common Lauange Runtime) 管理,GC 可移动对象的位置 - 非托管内存(Unmanaged Memory)
原始的内存块,比如操作系统 C API、C++库、显存缓冲区等。
问题:如果要把 C# 数据传给 C/C++,怎么保证他们在内存中布局是一致的。这就涉及到 blittable typs
什么是 Blittable Types, 什么是 Non Blittable Types
- Blittable Types: 内存标志在托管和非托管环境下完全一致的类型。
- 大多数数据类型在托管和非托管内存中都用共同的表示形式,并不需要互操作封装器进行特殊处理。这些类型被称为 Blittable Types, 因为它们在传递到托管和非托管代码之间时,不需要转换
System 命名空间下的 Blittable Types
判断一个类型是否 Blittable Types 的规则
一个 Blittable Types, 当且仅当:
- 他是值类型(struct 或基本值类型)
- 他的所有字段也都是 blittable
- 没有引用类型(class、string、object、interface、数组、泛型引用)
- 没有托管指针(ref、out、delegate、…)
Blittable_and_Non-Blittable_Typs
https://lshgame.com/2025/09/27/Blittable_and_Non-Blittable_Typs/