| RFC-0056:空结构体 | |
|---|---|
| 状态 | 已接受 |
| 适用范围 |
|
| 说明 | 允许在 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 字段。
实现策略
- 允许
fidlc接受空结构体并在 IR 中合成uint8字段。 - 更新
fidl_compatibility_test以包含空结构体。 - 更新文档。
- 更新
fidlc,使其不会为结构体发出额外的虚假字段,更新绑定生成器,并使用fidl_compatibility_test验证此操作是否有效。 - 从上述结构体中移除占位符字段。
文档和示例
FIDL 文档已包含空结构体的(无效) 示例。 语言文档可以简单地移除对零长度结构体的 限制。 线格式定义将获得有关如何编码空结构体的说明。
向后兼容性
此更改向后兼容,因为它放宽了 FIDL 语言,而不是对其进行限制。
如果接口作者将仅包含
字节大小占位符字段(boolean、uint8、int8)的语义上为空的结构体替换为空结构体,那么
在线上表示时,它们将完全相同。
性能
这应该不会对 build 或 IPC 性能产生任何影响,但对于允许使用空结构体的语言,它们将节省移动无意义值的工作。
安全
无影响。
测试
空结构体的编译将作为 fidlc 测试添加。
空结构体的线格式将作为 fidl_compatibility_test 的一部分进行测试。
缺点、替代方案和未知事项
我们可以保持现状,但这似乎是一个简单的改进。
在先技术和参考资料
大多数编程语言和 IDL 都允许使用空结构体。