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 都允许使用空结构体。