根據(jù)Chris Lattner介紹,Swift 4的主要目標之一就是要定義一個類似于Rust/Cyclone的內(nèi)存所有權(quán)模型(Memory Ownership Model)。Chris Lattner是Swift的創(chuàng)建者,在跳槽到Tesla之前曾擔任Swift團隊負責人。在Swift 4當前已進入第二階段的情況下,Swift團隊發(fā)布了一個宣言,詳細闡明了Swift內(nèi)存所有權(quán)的工作方式。
Swift編譯器為確定所有權(quán)轉(zhuǎn)換的時機,已實現(xiàn)了一種自己的不透明所有權(quán)模型(即ARC)。雖然所有權(quán)在一些情況下是很明晰的,但是編譯器也會在一些情況下做出錯誤假設(shè),進而導致不必要的復(fù)制。簡而言之,Swift的新內(nèi)存所有權(quán)模型使得內(nèi)存復(fù)制盡可能地處于開發(fā)人員的控制之下。定義該模型在于盡量克服當前寫時復(fù)制(copy-on-write)在引用計數(shù)方法上的不足之處,包括:引用計數(shù)的開銷及性能偶爾無法預(yù)測,以及為實現(xiàn)隨時可復(fù)制的需求而籠統(tǒng)地分配堆內(nèi)存。
雖然這些缺點通常對于應(yīng)用編程并不會構(gòu)成問題,但是對于那些需要一定性能保證的系統(tǒng)編程而言卻不受歡迎。此外,更靈活的內(nèi)存管理模型具有顯著優(yōu)點,這些優(yōu)點同樣適用于應(yīng)用編程,去解決特定瓶頸問題的優(yōu)化。基于上述原因,與ARC相比,選取Swift的新內(nèi)存所有權(quán)模型無疑會更具優(yōu)勢,只有那些對更細化控制有需求的開發(fā)人員才需要承擔模型的復(fù)雜性代價。
“獨占性原則”(Law of Exclusivity)會影響到所有的Swift開發(fā)人員,這一更改并非可選擇添加的。它強制變量不能以沖突的方式同時訪問,典型情況包括變量作為inout參數(shù)傳入兩個不同函數(shù),以及方法所接收的回調(diào)訪問了方法所調(diào)用的同一變量。這兩種情況當前在Swift中是允許的,移除他們無疑將會影響到所有的開發(fā)人員。此外,獨占性原則會更改對參數(shù)所做的保證,進而影響到語言的應(yīng)用二進制接口(ABI),因此它會成為被率先采用的特性之一。
除了獨占性原則之外,Swift還將引入新的標注和語言特性,允許傳遞共享值以及表達無法隱式復(fù)制的類型。宣言的作者指出。在獨占性、顯示控制共享值傳遞和不可復(fù)制類型這三種機制的共同作用下,編譯器可以對代碼做更好的優(yōu)化。
簡而言之,可以將新Swift所有權(quán)模型的高層愿景概括如下:
如上所述,編譯器將會標注所有非獨占性使用的inout參數(shù),無論是顯式的還是隱式的。
開發(fā)人員將可以定義一個變量是具有所有權(quán)的還是共享的,以避免在進入或離開詞法作用域時引用計數(shù)和做不必要的拷貝/銷毀。
開發(fā)人員將可以定義moveonly(即不可拷貝)類型,該類型對編譯器不可復(fù)制,也不能用于創(chuàng)建更多的引用。moveonly類型具有move語義,被認為是一種高級特性。除此以外,所有類型將默認是可復(fù)制的。
宣言中為這一所有權(quán)模型定義所賦予Swift的全部特性給出了長篇的和詳細的分析,宣言的細節(jié)內(nèi)容仍非最終版本。Swift開發(fā)人員Alexis Beingessner發(fā)布了一篇更簡短的文檔,扼要地概括了宣言的要點。
查看英文原文: Swift Memory Ownership Manifesto