一、類與結(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ǔ)在堆上。

- 棧區(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ū)域

二、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 中通通不可用...

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 (類似于OC的objc_object) ,有兩個(gè)屬性: 一個(gè)是 Metadata ,一個(gè)是 RefCount ,默認(rèn)占用 16 字節(jié)大小