天天看點

Swift記憶體所有權宣言

根據chris lattner介紹,swift 4的主要目标之一就是要定義一個類似于rust/cyclone的記憶體所有權模型(memory ownership model)。chris lattner是swift的建立者,在跳槽到tesla之前曾擔任swift團隊負責人。在swift 4目前已進入第二階段的情況下,swift團隊釋出了一個宣言,詳細闡明了swift記憶體所有權的工作方式。

swift編譯器為确定所有權轉換的時機,已實作了一種自己的不透明所有權模型(即arc)。雖然所有權在一些情況下是很明晰的,但是編譯器也會在一些情況下做出錯誤假設,進而導緻不必要的複制。簡而言之,swift的新記憶體所有權模型使得記憶體複制盡可能地處于開發人員的控制之下。定義該模型在于盡量克服目前寫時複制(copy-on-write)在引用計數方法上的不足之處,包括:引用計數的開銷及性能偶爾無法預測,以及為實作随時可複制的需求而籠統地配置設定堆記憶體。

雖然這些缺點通常對于應用程式設計并不會構成問題,但是對于那些需要一定性能保證的系統程式設計而言卻不受歡迎。此外,更靈活的記憶體管理模型具有顯著優點,這些優點同樣适用于應用程式設計,去解決特定瓶頸問題的優化。基于上述原因,與arc相比,選取swift的新記憶體所有權模型無疑會更具優勢,隻有那些對更細化控制有需求的開發人員才需要承擔模型的複雜性代價。

“獨占性原則”(law of exclusivity)會影響到所有的swift開發人員,這一更改并非可選擇添加的。它強制變量不能以沖突的方式同時通路,典型情況包括變量作為inout參數傳入兩個不同函數,以及方法所接收的回調通路了方法所調用的同一變量。這兩種情況目前在swift中是允許的,移除他們無疑将會影響到所有的開發人員。此外,獨占性原則會更改對參數所做的保證,進而影響到語言的應用二進制接口(abi),是以它會成為被率先采用的特性之一。

除了獨占性原則之外,swift還将引入新的标注和語言特性,允許傳遞共享值以及表達無法隐式複制的類型。宣言的作者指出。在獨占性、顯示控制共享值傳遞和不可複制類型這三種機制的共同作用下,編譯器可以對代碼做更好的優化。

簡而言之,可以将新swift所有權模型的高層願景概括如下:

如上所述,編譯器将會标注所有非獨占性使用的inout參數,無論是顯式的還是隐式的。

開發人員将可以定義一個變量是具有所有權的還是共享的,以避免在進入或離開詞法作用域時引用計數和做不必要的拷貝/銷毀。

開發人員将可以定義moveonly(即不可拷貝)類型,該類型對編譯器不可複制,也不能用于建立更多的引用。moveonly類型具有move語義,被認為是一種進階特性。除此以外,所有類型将預設是可複制的。

宣言中為這一所有權模型定義所賦予swift的全部特性給出了長篇的和詳細的分析,宣言的細節内容仍非最終版本。swift開發人員alexis beingessner釋出了一篇更簡短的文檔,扼要地概括了宣言的要點。

本文轉自d1net(轉載)

繼續閱讀