互通性
Rust 社群提供多個 C++/Rust 互通性選項,並且會持續開發新工具。目前 Chromium 使用的工具稱為 CXX。
您可以透過介面定義語言 (很類似 Rust) 描述整個語言邊界,然後 CXX 工具會為 Rust 和 C++ 中的函式和型別產生宣告。
如需完整的使用範例,請參閱 CXX 教學課程。
請完整講解圖表,說明背後的原理和先前的操作相同。請指出將程序自動化有以下優點:
- 這項工具會保證 C++ 和 Rust 端相符。舉例來說,當
#[cxx::bridge]
與實際的 C++ 或 Rust 定義不相符,就會發生「編譯錯誤」,但如有未同步的手動繫結,則會發生「未定義的行為」 - 這項工具會自動為非 C 功能產生 FFI 替換程式 (與 C-ABI 相容的小型、可自由使用的函式),例如讓 FFI 呼叫 Rust 或 C++ 方法;手動繫結會需要手動編寫這類頂層的、可自由使用的函式
- 這項工具和程式庫可處理一組核心型別,例如:
&[T]
傳遞時可以跨越 FFI 邊界,但無法保證任何特定 ABI 或記憶體布局。使用手動繫結時,std::span<T>
/&[T]
必須從一個指標和長度去手動解構並重新建構。這麼做很容易出錯,因為每種語言各以略微不同的方式表示空切片std::unique_ptr<T>
、std::shared_ptr<T>
和/或Box
等智慧指標均可原生支援。使用手動繫結時,必須傳遞與 C-ABI 相容的原始指標,這可能會增加生命週期和記憶體安全風險。rust::String
和CxxString
型別可理解並維持各語言字串表示法的差異,例如rust::String::lossy
可透過非 UTF8 輸入內容建構 Rust 字串,而rust::String::c_str
可以空終止字串。