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 语言的限制,而不是对其施加限制。如果接口作者将仅包含一个字节大小的占位符字段(booleanuint8int8)的语义上空结构体替换为空结构体,那么在线路上,这两个结构体甚至会以相同的方式表示。

性能

这应该不会影响构建或 IPC 性能,但对于允许使用空结构体的语言,这将节省移动无意义值的工作。

安全

无影响。

测试

空结构体的编译将作为 fidlc 测试添加。 空结构体的线格格式将在 fidl_compatibility_test 的测试范围内进行测试。

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

我们可以让一切保持不变,但这似乎是一个简单的改进。

在先技术和参考文档

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