| RFC-0056:空結構體 | |
|---|---|
| 狀態 | 已接受 |
| 區域 |
|
| 說明 | 允許在 FIDL 程式庫宣告中使用空白結構體,並將該結構體的編碼定義為具有單一零值 uint8 的結構體。 |
| 作者 | |
| 提交日期 (年-月-日) | 2018-08-30 |
| 審查日期 (年-月-日) | 2018-09-11 |
摘要
允許在 FIDL 程式庫宣告中使用空白結構體,並將該結構體的編碼定義為具有單一零值 uint8 的結構體。
提振精神
如今,我們發現許多領域都需要空白結構體。舉例來說,使用指令模式時,其中一個指令不需要任何引數。假設您有「ping」指令,只要選取這個聯集選項,就足以傳達意圖。 一般來說,模擬代數資料型別時,空結構體可用於表示「單元型別」。
不過,部分目標語言不允許使用空白結構體:您無法使用空白 C/C++ 結構體,而且我們希望 FIDL 線路編碼可對應至 C 資料型別。
由於有這項需求,且目前受到限制,我們發現語意空白的結構體數量激增,但實際上這些結構體只有一個小型預留位置欄位,因此可以編譯。
例如:
本提案會將特定語言集的限制與 FIDL 語言分離,同時維持與 C 結構體的線路格式相容性。
設計
FIDL 前端編譯器應接受空白結構定義。
空 struct 的 TypeShape 應與具有單一 uint8 欄位的 struct 相同。
可處理空白結構體的語言的繫結產生器應產生實際的空白結構體,但必須注意確保空白結構體正確編碼為採用位元組的結構體。如果是 C 和 C++,則應產生單一 uint8_t __reserved 欄位。
導入策略
- 允許
fidlc接受空白結構體,並在 IR 中合成uint8欄位。 - 更新
fidl_compatibility_test,加入空白結構體。 - 更新說明文件。
- 更新
fidlc,不要為空白結構體發出額外的虛假欄位,更新繫結產生器,並使用fidl_compatibility_test驗證這項作業是否正常運作。 - 從上述結構體中移除預留位置欄位。
說明文件和範例
FIDL 文件已包含空結構體的範例 (無效)。語言文件可以單純移除零長度結構體的限制。線路格式定義會新增說明,介紹如何編碼空白結構體。
回溯相容性
這項變更具有回溯相容性,因為它放寬而非限制 FIDL 語言。
如果介面作者以空白結構體取代只包含位元組大小預留位置欄位 (boolean、uint8、int8) 的語意空白結構體,則在連線上也會以相同方式表示。
效能
這項異動不會影響建構或 IPC 效能,但對於允許空結構體的語言,可節省移動無意義值的工作。
安全性
沒有影響。
測試
空白結構的編譯作業會新增為 fidlc 測試。系統會在 fidl_compatibility_test 中測試空白結構的連線格式。
缺點、替代方案和未知事項
我們可以維持現狀,但這似乎是簡單的改進措施。
既有技術和參考資料
大多數程式設計語言和 IDL 都允許使用空白結構體。