swift 類與結(jié)構(gòu)體

一、類與結(jié)構(gòu)體的對(duì)比

1.在 Swift 中類和結(jié)構(gòu)體有很多共同之處:
  • 定義屬性用來存儲(chǔ)值;
  • 定義方法用于提供功能;
  • 定義下標(biāo)腳本用來允許使用下標(biāo)語法訪問值;
  • 定義初始化器用于初始化狀態(tài);
  • 可以被擴(kuò)展來默認(rèn)所沒有的功能;
  • 遵循協(xié)議來針對(duì)特定類型提供標(biāo)準(zhǔn)功能。
2.類比結(jié)構(gòu)體多出的功能:
  • 繼承允許一個(gè)類繼承另一個(gè)類的特征;
  • 類型轉(zhuǎn)換允許你在運(yùn)行檢查和解釋一個(gè)類實(shí)例的類型;
  • 反初始化器允許一個(gè)類實(shí)例釋放任何其所被分配的資源;
  • 引用計(jì)數(shù)允許不止一個(gè)對(duì)類實(shí)例的引用。
結(jié)構(gòu)體與類的本質(zhì)區(qū)別為結(jié)構(gòu)體是值類型,類是引用類型(其實(shí)也可以理解為指針類型)。

也就是說一個(gè)類類型的變量并不直接存儲(chǔ)具體的實(shí)例對(duì)象,而是對(duì)當(dāng)前存儲(chǔ)具體實(shí)例內(nèi)存地址的引用。所以它們還有一個(gè)最直觀的區(qū)別就是存儲(chǔ)的位置不同:一般情況,值類型存儲(chǔ)的在棧上,引用類型存儲(chǔ)在堆上。

內(nèi)存區(qū)域
  • 棧區(qū)(stack): 局部變量和函數(shù)運(yùn)行過程中的上下文
  • Heap: 存儲(chǔ)所有對(duì)象
  • Global: 存儲(chǔ)全局變量;常量;代碼區(qū)
  • Segment & Section: Mach-O 文件有多個(gè)段( Segment ),每個(gè)段有不同的功能。然后每 個(gè)段又分為很多小的 Section
  • TEXT.text : 機(jī)器碼
  • TEXT.cstring : 硬編碼的字符串
  • TEXT.const: 初始化過的常量
  • DATA.data: 初始化過的可變的(靜態(tài)/全局)數(shù)據(jù) DATA.const: 沒有初始化過的常量
  • DATA.bss: 沒有初始化的(靜態(tài)/全局)變量
  • DATA.common: 沒有初始化過的符號(hào)聲明
可以通過cat 命令獲取具體的內(nèi)存區(qū)域
cat 命令獲取具體的內(nèi)存區(qū)域

二、Swift編譯過程

Swift的編譯過程與OC有所區(qū)別,雖然它們的后端都是使用LLVM來編譯生成.o可執(zhí)行文件,但是前端OC使用Clang生成IR,Swift的編譯器內(nèi)部包含Clang,擴(kuò)展了Swiftc來生成對(duì)應(yīng)的 IR。并且有一點(diǎn)需要注意Swift沒有預(yù)處理過程,所以之前在 OC 中通過宏定義完成的一些常量等,在 Swift 中通通不可用...

Swift編譯過程

1.Parse 語法解析器

分析輸出AST語法分析解析器是一個(gè)簡(jiǎn)單的遞歸解析器(在lib/Parse中實(shí)現(xiàn)),帶有一個(gè)集成的、手工編碼的 lexer.cpp。解析器負(fù)責(zé)生成沒有任何語義或類型信息的抽象語法樹(abstractsyntax Tree,AST),并針對(duì)輸入源的語法問題發(fā)出警告或錯(cuò)誤。
swiftc main.swift -dump-parse

2.語義分析

語義分析(在lib/Sema中實(shí)現(xiàn))負(fù)責(zé)獲取解析后的 AST,并將其轉(zhuǎn)換為格式良好、完全檢查類型的 AST 形式,附上了所有類型的信息,針對(duì)源代碼中的語義問題拋出 warning 或 error。
swiftc main.swift -dump-ast

3.生成中間體語言(SIL),未優(yōu)化

SIL 又是一種高級(jí)的、特定于 Swift 的中間語言,適合進(jìn)一步分析和優(yōu)化 Swift 代碼。SIL 也是一種 SSA 形式的 IR,lib/SILGen 這個(gè)庫會(huì)將類型檢查的 AST 降低為所謂的 raw SIL,這是一種原始的SIL。
swiftc main.swift -emit-silgen

4.生成中間體語言(SIL),優(yōu)化后的

通過以下命令再進(jìn)一步進(jìn)行優(yōu)化,輸出優(yōu)化之后的 SIL。SIL 的這部分優(yōu)化(在lib/Analysis、lib/ARC、lib/LoopTransforms和lib/Transforms中實(shí)現(xiàn))對(duì)程序執(zhí)行額外的高級(jí)、特定于 Swift 的優(yōu)化,包括不限于:自動(dòng)引用計(jì)數(shù)優(yōu)化、非虛擬化和通用專門化等
swiftc main.swift -emit-sil

5.生成LLVM中間體語言 (.ll文件)

swiftc main.swift -emit-ir

6.生成LLVM中間體語言 (.bc文件)

swiftc main.swift -emit-bc

7.生成匯編

LLVM 可以繼續(xù)優(yōu)化它并生成機(jī)器代碼
swiftc main.swift -emit-assembly

8.編譯生成可執(zhí)行.out文件

swiftc -o main.o main.swift

swift 內(nèi)存結(jié)構(gòu)

struct HeapObject{
    var metadata: UnsafeRawPointer
    var refcounted1: UInt32
    var refcounted2: UInt32
}

struct Metadata{
    var kind: Int
    var superClass: Any.Type
    var cacheData: (Int, Int)
    var data: Int
    var classFlags: Int32
    var instanceAddressPoint: UInt32
    var instanceSize: UInt32
    var instanceAlignmentMask: UInt16
    var reserved: UInt16
    var classSize: UInt32
    var classAddressPoint: UInt32
    var typeDescriptor: UnsafeMutableRawPointer
    var iVarDestroyer: UnsafeRawPointer
}

Swift對(duì)象的內(nèi)存結(jié)構(gòu)HeapObject (類似于OCobjc_object) ,有兩個(gè)屬性: 一個(gè)是 Metadata ,一個(gè)是 RefCount ,默認(rèn)占用 16 字節(jié)大小

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容