RFC-0056:空结构体

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

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

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

摘要

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

设计初衷

如今,我们发现许多领域都需要使用空结构体。 例如,当使用命令模式时,其中一个命令不需要任何实参。假设您有一个“ping”命令,只需选择此联合选项即可传达意图。 从广义上讲,在模拟代数数据类型时,空结构体可用于表示“单位类型”。

不过,某些目标语言不允许使用空结构体:您不能使用空 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 语言,而不是对其进行限制。 如果接口作者将仅包含字节大小占位字段(booleanuint8int8)的语义上为空的结构体替换为空结构体,那么在网络上,这两者甚至会以相同的方式表示。

性能

这应该不会影响 build 或 IPC 性能,但对于允许空结构的语言,它们可以节省移动无意义值的工作。

安全

无影响。

测试

将添加空结构体的编译作为 fidlc 测试。 空结构体的有线格式将作为 fidl_compatibility_test 的一部分进行测试。

缺点、替代方案和未知因素

我们可以保持现状,但这项改进似乎很简单。

在先技术和参考资料

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