Swift~匯編分析結構體玫膀、類的內存布局

本文源自本人的學習記錄整理與理解封断,其中參考閱讀了部分優(yōu)秀的博客和書籍,盡量以通俗簡單的語句轉述舶担。引用到的地方如有遺漏或未能一一列舉原文出處還望見諒與指出坡疼,另文章內容如有不妥之處還望指教,萬分感謝衣陶。

結構體

Swift標準庫中柄瑰,絕大多數(shù)的公開類型都是結構體,而枚舉和類只占很少一部分剪况,比如:Bool教沾、Int、Double译断、String授翻、Array、Dictionary等常見類型都是結構體

  • 開發(fā)者可以自定義結構體

結構體定義
struct Date {
var year: Int
var month: Int
var day: Int
}

使用(利用初始化器初始化Date)   孙咪,可以傳入所有成員值堪唐,用以初始化所有成員(存儲屬性或Stored Property)
var date =  Date(year: 2020, month: 5, day: 18 )

  • 所有結構體都有一個編譯器自動生成的初始化器(initializer、初始化方法翎蹈、構造器淮菠、構造方法)
  • 在Date(year: 2020, month: 5, day: 18 )調用時,可以傳入所有成員值荤堪,用以初始化所有成員(存儲屬性合陵,Stored Property)

結構體的初始化器

  • 在初始化時必須傳入所有成員值枢赔,否則就會編譯報錯,前提是成員沒有給初始值
  • 編譯器會根據(jù)情況拥知,可能會為結構體生成多個初始化器踏拜;宗旨是:保證所有成員都有初始化值
生成多個初始化器.png

思考:下面代碼能編譯通過嗎 ?

struct Point {

var x:Int?
var y:Int?

}

var p1 = Point(x:10,y:10)
var p2 = Point(y:10)
var p3 = Point(x:10)
var p4 = Point()

可以編譯通過举庶,可選項都有一個默認值nil; 因此可以編譯通過

自定義初始化器

  • 一旦定義結構體時自定義初始化器执隧,編譯器就不會再幫它自動生成其他初始化器

struct Point {

var x:Int?
var y:Int?

  //自定義初始化器
   init(x:Int, y:Int){
       self.x = x
       self.y = y
   }

}

var p1 = Point(x:10,y:10)
var p2 = Point(y:10)
var p3 = Point(x:10)
var p4 = Point()

窺探初始化器的本質

下面兩段代碼是完全等效的


struct Point {

var x:Int
var y:Int

  //自定義初始化器
   init(){
       x = 0
       y = 0
   }

}

---------------------------------------------

struct Point {
var x:Int = 0
var y:Int = 0
}

結構體的內存結構

示例.png

x和y各占8個字節(jié),Bool占一個字節(jié)户侥;內存對齊是8的倍數(shù)镀琉;所以最終Point占24字節(jié)

  • 類的定義和結構體類似,但編譯器并沒有為類自動生成可以傳入成員值得初始化器
示例.png

類的初始化器

  • 如果類的所有成員都在定義的時候指定了初始值蕊唐,編譯器會為類生成無參的初始化器
  • 成員的初始化是在這個初始化器中完成的屋摔;所以下面兩段代碼完全等效

class Point {

var x:Int
var y:Int

  //自定義初始化器
   init(){
       x = 0
       y = 0
   }

}

---------------------------------------------

class Point {
var x:Int = 0
var y:Int = 0
}

結構體和類的本質區(qū)別

  • 結構體是值類型(枚舉也是值類型),類是引用類型(指針類型)
  • 結構體不需要向堆空間申請內存替梨,類需要向堆空間申請內存
示例.png

對象的對空間申請過程

Swift中創(chuàng)建類.png

函數(shù)被定義在類的內部和在外部钓试,都是向棧空間申請內存 副瀑!唯一的區(qū)別就是作用域不同

示例.png

值類型

  • 值類型賦值給var弓熏、let或者給函數(shù)傳參,是直接將所有內容拷貝一份
  • 類似于對文件進行copy糠睡、paste操作挽鞠,產生了新的副本;屬于深拷貝(deep copy)
值類型分析.png
  • 值類型的賦值操作
var s1 = "逍遙侯"
var s2 = s1
s2.append("~泰牛了")
print(s1)  //輸出結果:逍遙侯
print(s2)  //輸出結果:逍遙侯~泰牛了

  • 在Swift標準庫中狈孔,為了提升性能信认,String、Array均抽、Dictionary嫁赏、Set采取了 Copy On Write 的技術 ; 也就是說當我們去修改內存時才會有copy操作,只是單純的賦值是不會深拷貝油挥!
    注意:自己定義的結構體是沒有這個操作的
  • 比如僅當有”寫“操作時潦蝇,才會真正執(zhí)行拷貝操作
  • 對于標準庫類型的賦值操作,Swift能確定最佳性能喘漏,所以沒必要為了保證最佳性能來避免賦值护蝶;建議:不需要修改的,盡量定義成let

引用類型

  • 引用類型賦值給var翩迈、let或者給函數(shù)傳參持灰,是將內存地址拷貝一份
  • 類似于制作一個文件的替身(快捷方式、鏈接)负饲,指向的是同一個文件堤魁。屬于淺拷貝(shallow copy)
引用類型示例.png

注意:全局變量的內存地址是唯一的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末喂链,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妥泉,更是在濱河造成了極大的恐慌椭微,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盲链,死亡現(xiàn)場離奇詭異蝇率,居然都是意外死亡,警方通過查閱死者的電腦和手機刽沾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門本慕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侧漓,你說我怎么就攤上這事锅尘。” “怎么了布蔗?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵藤违,是天一觀的道長。 經常有香客問我纵揍,道長顿乒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任泽谨,我火速辦了婚禮淆游,結果婚禮上,老公的妹妹穿的比我還像新娘隔盛。我一直安慰自己,他們只是感情好拾稳,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布吮炕。 她就那樣靜靜地躺著,像睡著了一般访得。 火紅的嫁衣襯著肌膚如雪龙亲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天悍抑,我揣著相機與錄音鳄炉,去河邊找鬼。 笑死搜骡,一個胖子當著我的面吹牛拂盯,可吹牛的內容都是我干的。 我是一名探鬼主播记靡,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼谈竿,長吁一口氣:“原來是場噩夢啊……” “哼团驱!你這毒婦竟也來了?” 一聲冷哼從身側響起空凸,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嚎花,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呀洲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體紊选,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年道逗,在試婚紗的時候發(fā)現(xiàn)自己被綠了兵罢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡憔辫,死狀恐怖趣些,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情贰您,我是刑警寧澤坏平,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站锦亦,受9級特大地震影響舶替,放射性物質發(fā)生泄漏。R本人自食惡果不足惜杠园,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一顾瞪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抛蚁,春花似錦陈醒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肚逸,卻和暖如春爷辙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朦促。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工膝晾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人务冕。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓血当,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歹颓,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容