RFC-0056:空结构体 | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 允许在 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
字段。
实施策略
- 允许
fidlc
接受空结构体并在 IR 中合成uint8
字段。 - 更新
fidl_compatibility_test
以包含一个空结构体。 - 更新文档。
- 更新
fidlc
以避免针对空结构体发出奖励虚假字段,更新绑定生成器,并使用fidl_compatibility_test
验证其是否正常运行。 - 从上述结构体中移除占位符字段。
文档和示例
FIDL 文档已包含空结构体(无效)示例。语言文档只需移除对零长度结构体的限制即可。有线格式定义将获得有关如何编码空结构体的说明。
向后兼容性
此变更可以向后兼容,因为它放宽了 FIDL 语言的约束条件,而不是对 FIDL 语言的限制。
如果接口作者将仅包含一个字节大小的占位符字段(boolean
、uint8
、int8
)的语义空结构体替换为空结构体,则该结构体在线上也会以相同的方式表示。
性能
这应该不会对 build 或 IPC 性能产生任何影响,但对于允许使用空结构体的语言,它们将省去转移无意义值的工作量。
安全性
无影响。
测试
空结构体的编译将添加为 fidlc
测试。空结构体的传输格式将在 fidl_compatibility_test
中进行测试。
缺点、替代方案和未知情况
我们可以保持原样,但这似乎是一个简单的改进。
早期技术和参考资料
大多数编程语言和 IDL 都允许空结构体。