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
) 替換為空白結構,那麼介面作者將其中只有位元組大小的預留位置欄位取代為空白結構,那麼線上也會以相同的方式表示。
效能
這應該不會影響建構或處理序間通訊 (IPC) 效能,但如果語言允許空白結構,就能節省處理無意義值的工作。
安全性
沒有影響。
測試
空白結構的編譯將新增為 fidlc
測試。空白結構體的傳輸格式會在 fidl_compatibility_test
中測試。
缺點、替代方案和未知
我們可以保留原樣,但這看起來是個簡單的改善空間。
先前的圖片和參考資料
大部分的程式設計語言和 IDL 都允許空白結構。