这是关于 Rust 中类型布局和 ABI 的笔记,包含以下主要内容:
- 平台解剖:Rust 支持的平台需满足特定条件,如 8 位未对齐字节、布尔为字节等,还支持大端整数/浮点数、16 位指针等,可能支持分段架构等但未充分考虑。
类型解剖:
- 大小:类型的基本属性,Rust 中类型可有 0 大小,泛型函数处理大小动态的类型需用
<T:?Sized>。 - 对齐:类型在内存中的位置需是字节数的倍数,大小是对齐的倍数,零大小类型也可有对齐,某些旧的 ABI 对 double 的对齐方式特殊。
- 偏移:类型字段的相对位置,Rust 中默认用户定义类型的偏移非确定性,有优化和模糊测试的动机,某些注解可诱导确定性字段顺序。
- 布局:类型的大小、对齐、偏移及字段的递归布局,知道布局可访问字段和转换兼容布局的类型,可通过
#[repr(C)]等注解定义布局。 - ABI:类型的 ABI 决定如何按值传递给 C 函数,Rust 中有 4 种类型种类,整数、浮点数、聚合、向量,聚合和向量的 ABI 取决于字段的 ABI。
- 内置类型的布局/ABI:给出了 Rust 中核心原语的 ABI 信息,如各种整数、浮点数、指针等类型的大小、对齐、定义值等,数组布局与 C 数组相似,元组布局未指定。
- 大小:类型的基本属性,Rust 中类型可有 0 大小,泛型函数处理大小动态的类型需用
- 指定布局和 ABI:
#[repr(C)]等注解可影响类型的布局和 ABI,如#[repr(C)]强制字段按声明顺序布局,#[repr(simd)]给类型向量类型种类等。 扩展随机笔记:
- C 整数层次结构:C 为解决不同平台字节大小和整数大小问题定义了整数层次结构,但精确大小很重要,历史上曾导致一些问题。
- 字节序:整数和浮点数的字节序有大端和小端之分,如今小端占优势,Rust 支持剩余大端平台。
- 分段架构:分段架构中相同运行时表示的指针可能指向不同内存区域,存在一些编程模型上的问题。
- 调用约定:调用约定是 ABI 的一部分,涉及函数参数和返回值的传递方式,现代调用约定通常是混合的,不同架构的调用约定有所不同,如 x86 和 x64 的 System V ABI 在值传递方式上有差异。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。