RFC-0056:空白結構

RFC-0056:空結構體
狀態已接受
區域
  • FIDL
說明

允許在 FIDL 程式庫宣告中使用空結構體,並將該結構體的編碼定義為含有單一零值 uint8 的結構體。

作者
提交日期 (年-月-日)2018-08-30
審查日期 (年-月-日)2018-09-11

摘要

允許在 FIDL 程式庫宣告中使用空結構體,並將該結構體的編碼定義為含有單一零值 uint8 的結構體。

提振精神

我們發現,在許多不同領域都需要使用空結構體。例如,使用指令模式時,其中一個指令不需要任何引數。假設您有「ping」指令,只要選取這個聯合選項,即可傳達意圖。模擬代數資料類型時,一般化空結構體可用於表示「單位類型」。

不過,部分目標語言不允許使用空結構體:您無法使用空白的 C/C++ 結構體,而且我們希望 FIDL 線路編碼可對應至 C 資料類型。

基於需求和目前的限制,我們發現結構體的數量不斷增加,這些結構體在語意上是空的,但實際上有一個小型預留位置欄位,因此可以編譯。

例如:

這項提案會將特定語言組合的限制與 FIDL 語言分離,同時維持與 C 結構體的線路格式相容性。

設計

FIDL 前端編譯器應接受空結構定義。空 struct 的 TypeShape 應與包含單一 uint8 欄位的 struct 相同。

可處理空 struct 的語言的繫結產生器應產生實際的空 struct,但必須小心確保空 struct 正確編碼為取用位元的 struct。針對 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 都允許使用空結構體。