結(jié)構(gòu)體
在Swift標準庫中,絕大多數(shù)的公開類型都是結(jié)構(gòu)體排惨,而枚舉和類只占很小一部分吭敢。
比如Bool、int若贮、Double省有、String痒留、Array、Dictionary等常見的類型都是結(jié)構(gòu)體
所有的結(jié)構(gòu)體都有一個編譯器自動生成的初始化器
調(diào)用的時候所有成員的值都要初始化蠢沿,否則報錯伸头,保證所有成員都要有初始值
一旦在定義結(jié)構(gòu)體時自定義了初始化器,編譯器就不會在幫他自動生成其他初始化器(調(diào)用init方法)
結(jié)構(gòu)體是值類型 (枚舉也是值類型)
值類型函數(shù)創(chuàng)建存儲在椣象埃空間恤磷,指針變量的地址存儲在棧空間野宜,但是地址指向的內(nèi)容存儲在堆空間?
窺探初始化器的本質(zhì)
匯編代碼分析
首先會調(diào)用init方法進入函數(shù)內(nèi)部扫步,找到立即數(shù):movq? $0x0,-0x10(%rbp)和movq? $0x0,-0x8(%rbp)這里就是給兩個局部變量賦值分配內(nèi)存空間
結(jié)構(gòu)體分析
匯編代碼分析
?movl? $0xa, %eax? ? ? ? ? ? ? ? ? ? ? ? ? ?10賦值給eax寄存器,eax屬于rax匈子,所以10復制給rax寄存器
?movq? %rax, %rdi? ? ? ? ? ? ? ? ? ? ? ? ? ?10賦值給rdi寄存器
?movl? $0x14, %eax? ? ? ? ? ? ? ? ? ? ? ? ? 20->eax->rax
?movq? %rax, %rsi? ? ? ? ? ? ? ? ? ? ? ? ? ? ?20->rsi
中間有一步調(diào)用函數(shù)將rdi賦值給rax河胎,rsi賦值給rdx
movq? %rax,0x662d(%rip)? ? ? ? ? ? ? ? 將10賦值給一個地址其實就是p1的內(nèi)存地址 占8個字節(jié)
?movq? %rdx,0x662e(%rip)? ? ? ? ? ? ? ?將20賦值給rip+0x662e這個地址,10和20是連續(xù)的16個字節(jié)
?movq? 0x6603(%rip), %rax? ? ? ? ? ? ? 取出rip+0x6603的地址虎敦,其實就是0x662d(%rip)的地址游岳,rip是不相同的? ?也就是將10復制給rax寄存器
movq? %rax,0x660c(%rip)? ? rip+0x660c? =0x100000bfc+0x660c? ? ? p2的內(nèi)存地址
?movq? 0x65fd(%rip), %rax? ? 20