我已经看到一些 Rust 代码库使用#[repr(C)]宏(它叫什么?),但是,我找不到太多信息,但是它将内存中的类型布局设置为与“C”相同的布局。
这是我想知道的:这是一个仅限于编译器而不是语言本身的预处理器指令(即使 Rust 没有任何其他编译器前端),以及为什么 Rust 的内存布局与Cs的?(只是我从来没有用另一种语言来做这件事)。谢谢。
编辑:这是一个很好的情况来证明我的意思;如果有人为 Rust 创建了另一个编译器,他们是否需要实现这个宏,还是编译器特定的东西?
小智 7
#[repr(C)]不是预处理器指令,因为 Rust 不使用预处理器1。它是一个属性。Rust 没有完整的规范,但是在 Rust 参考中提到了该repr属性,因此它绝对是该语言的一部分。在实现方面,属性的解析方式与所有其他 Rust 代码相同,并存储在同一个 AST 中。Rust 没有“属性传递”:属性是语言的实际部分。如果其他人要实现 Rust 编译器,他们将需要实现.#[repr(C)]
此外,没有一些编译器魔法#[repr(C)] 就无法实现。在没有 a 的情况下#[repr(...)],Rust 编译器可以随意安排 a struct/的字段,enum但是他们想这样做(并且他们确实利用了这一点来进行优化!)。
Rust 确实有充分的理由使用它自己的内存布局。如果编译器不依赖于 astruct在源代码中的编写方式,他们可以进行优化,例如不存储struct从未读取过的字段、重新排序字段以获得更好的性能、enum标记池2以及在整个NonZero*s 结构中使用备用位以存储数据(最后一个还没有发生,但将来可能会发生)。但主要原因是 Rust 有一些在 C 中没有意义的东西。 例如,Rust 有零大小的类型(如()and [i8; 0]),它们不能存在于 C、traitvtables、enum带有字段的 s、泛型类型等其中在尝试将它们转换为 C 时会导致问题。
1好的,如果您真的愿意,可以将 C 预处理器与 Rust 结合使用。请不要。
2例如,enum Food { Apple, Pizza(Topping) } enum Topping { Pineapple, Mushroom, Garlic }可以仅存储在 1 个字节中,因为只能Food创建4 个可能的值。
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |