RFC-0056:空结构体

RFC-0056:空结构体
状态已接受
领域
  • FIDL
说明

允许在 FIDL 库声明中使用空结构体,并将其编码定义为具有单个零值 uint8 的结构体。

作者
提交日期(年-月-日)2018-08-30
审核日期(年-月-日)2018-09-11

总结

允许在 FIDL 库声明中使用空结构体,并将其编码定义为具有单个零值 uint8 的结构体。

设计初衷

如今,我们看到各个领域对空结构体的需求不断涌现。例如,在使用命令模式时,其中一个命令不需要任何参数。假设您有一个“ping”命令,选择此并集选项就足以传达 intent。在模拟代数数据类型时,可以泛化使用空结构体来表示“单位类型”。

不过,在某些目标语言中不允许使用空结构体:您不能有空的 C/C++ 结构体,并且我们希望 FIDL 有线编码能够映射到 C 数据类型。

由于这种需求和当前存在的限制,我们看到结构体数量激增,这些结构在语义上是空的,但实际上只有一个小型占位符字段,可以进行编译。

以下是一些示例:

该方案将一组特定语言的约束条件与 FIDL 语言分离开来,同时保持有线格式与 C 结构体的兼容性。

设计

FIDL 前端编译器应接受空结构体定义。 空结构体的 TypeShape 应与具有单个 uint8 字段的结构体相同。

可以处理空结构体的语言的绑定生成器应生成实际的空结构体,但必须格外小心,确保空结构体正确编码为接受字节的结构。对于 C 和 C++,应生成单个 uint8_t __reserved 字段。

实施策略

  1. 允许 fidlc 接受空结构体并在 IR 中合成 uint8 字段。
  2. 更新 fidl_compatibility_test 以包含一个空结构体。
  3. 更新文档。
  4. 更新 fidlc 以避免针对空结构体发出奖励虚假字段,更新绑定生成器,并使用 fidl_compatibility_test 验证其是否正常运行。
  5. 从上述结构体中移除占位符字段。

文档和示例

FIDL 文档已包含空结构体(无效)示例。语言文档只需移除对零长度结构体的限制即可。有线格式定义将获得有关如何编码空结构体的说明。

向后兼容性

此变更可以向后兼容,因为它放宽了 FIDL 语言的约束条件,而不是对 FIDL 语言的限制。 如果接口作者将仅包含一个字节大小的占位符字段(booleanuint8int8)的语义空结构体替换为空结构体,则该结构体在线上也会以相同的方式表示。

性能

这应该不会对 build 或 IPC 性能产生任何影响,但对于允许使用空结构体的语言,它们将省去转移无意义值的工作量。

安全性

无影响。

测试

空结构体的编译将添加为 fidlc 测试。空结构体的传输格式将在 fidl_compatibility_test 中进行测试。

缺点、替代方案和未知情况

我们可以保持原样,但这似乎是一个简单的改进。

早期技术和参考资料

大多数编程语言和 IDL 都允许空结构体。