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, 当且仅当:

  1. 他是值类型(struct 或基本值类型)
  2. 他的所有字段也都是 blittable
  3. 没有引用类型(class、string、object、interface、数组、泛型引用)
  4. 没有托管指针(ref、out、delegate、…)

Blittable_and_Non-Blittable_Typs
https://lshgame.com/2025/09/27/Blittable_and_Non-Blittable_Typs/
作者
SuHang
发布于
2025年9月27日
许可协议