前言:
僅為視頻學(xué)習(xí)筆記
MemoryLayout
MemoryLayout怎么用呢仲墨?
★可以使用MemoryLayout獲取數(shù)據(jù)類型占用的內(nèi)存大小
MemoryLayout是可以寫成泛型押搪。
var age = 10
那么,我們想知道age這個(gè)變量占用多少內(nèi)存茅坛,那么怎么辦呢观挎?這個(gè)用法其實(shí)也非常簡單,如下:
MemoryLayout.size(ofValue: age) // 8 MemoryLayout.stride(ofValue: age) // 8 MemoryLayout.alignment(ofValue: age) // 8
我們會(huì)發(fā)現(xiàn)挪凑,打印出來的跟 例-1所打印出來的一樣,因?yàn)閍ge它就是Int類型夯巷。所以 例-1跟上面代碼赛惩,打印出來是一樣的,百分百是等價(jià)的趁餐。
看一下size和stride有什么區(qū)別喷兼?要看出它們的區(qū)別,當(dāng)然要搞些不同的類型才能看出來后雷。比如說季惯,就拿我們這個(gè)枚舉來說,你也許很好奇臀突,這個(gè)枚舉變量勉抓,到底占用多少內(nèi)存呢?
Password是密碼候学,一個(gè)是數(shù)字密碼藕筋,一個(gè)就是另外一種密碼。
swift編碼規(guī)范里面梳码,枚舉的類型首字母念逞,是大寫的,采用駝峰標(biāo)示边翁,它里面的所有成員,建議小寫開頭硕盹。
var pwd = Password.number(5, 6, 4, 7) // 占用32字節(jié) pwd = .other
比如符匾,上面代碼,我們猜測(cè)一下瘩例, 第一行啊胶,和第二行,各占多少內(nèi)存呢垛贤? 也就是焰坪,我想知道 pwd 這個(gè)變量,編譯器給它分配多少個(gè)內(nèi)存呢聘惦?
首先某饰,先下一個(gè)定論,你看,我先定義了一個(gè)pwd變量黔漂,那么這個(gè)變量呢诫尽?一個(gè)是賦得值是 Password.number(5, 6, 4, 7),之前說過炬守,像這種關(guān)聯(lián)值(5, 6, 4, 7) 是直接存儲(chǔ)在pwd這個(gè)變量里面,所以說你這個(gè)變量內(nèi)存肯定裝得下這4個(gè)(5, 6, 4, 7) 牧嫉,那么每一個(gè)Int類型占8個(gè)字節(jié),那你4個(gè)减途,4x8 = 32 ,32個(gè)字節(jié)酣藻。所以pwd 這個(gè)變量至少是32個(gè)字節(jié)。
那么鳍置,現(xiàn)在我假定var pwd = Password.number(5, 6, 4, 7)是32個(gè)字節(jié) 辽剧,那么pwd = .other這個(gè)位置呢?思考一下墓捻,肯定是你 var pwd = Password.number(5, 6, 4, 7)這行占用了多少字節(jié)pwd = .other這行占用多少字節(jié)抖仅。也就是說,var pwd = Password.number(5, 6, 4, 7)是32個(gè)字節(jié)砖第,那么到后邊的時(shí)候仍然是32個(gè)字節(jié)撤卢。只是用32個(gè)字節(jié)存儲(chǔ).other這個(gè)家伙而已。
不可能說梧兼,根據(jù)我賦的值不同放吩,到時(shí)候我動(dòng)態(tài)改變內(nèi)存,這樣多麻煩羽杰。
變量內(nèi)存已經(jīng)開辟了32個(gè)字節(jié)渡紫,上面占用32個(gè)字節(jié),下面也占用32個(gè)字節(jié)考赛,變量內(nèi)存是不會(huì)動(dòng)態(tài)改變的惕澎,沒用也要占用在內(nèi)存里面。
因?yàn)檠罩瑁灰鉷wd是Password類型的唧喉,那么它的大小已經(jīng)固定了,就是這么大忍抽。但是八孝,你以后是存儲(chǔ)number(Int,Int,Int,Int)這個(gè) 還是 other取決于你自己。
下面我們看究竟占多少呢鸠项?
如上面方法干跛,得知,size和stride是不一樣的祟绊。一個(gè)是33楼入,一個(gè)是40哥捕,到底是哪個(gè)才對(duì)呢?
先說一下size和stride有什么區(qū)別:
stride這個(gè)家伙是范圍的意思浅辙,打印出來這個(gè)40是什么意思呢扭弧,這個(gè)就是這個(gè)變量實(shí)際占用的空間大小,也就是說這個(gè)就是它真正的所要占用的空間大小记舆。
size是什么呢鸽捻? size是實(shí)際用到的空間大小,也就是說泽腮,實(shí)際可能用到的大小御蒲。相當(dāng)于就是有7個(gè)字節(jié)是浪費(fèi)掉的。有7個(gè)字節(jié)你是永遠(yuǎn)用不到的诊赊。
再來看alignment我們這個(gè)內(nèi)存對(duì)齊參數(shù)厚满,很明顯是8。那就是意味著碧磅,你最后占用的內(nèi)存大小肯定是8的倍數(shù)碘箍,所以說stride這個(gè)家伙,系統(tǒng)分配給它的就是40個(gè)字節(jié)鲸郊,這40個(gè)字節(jié)丰榴,其中有33個(gè)字節(jié),是拿來實(shí)際放東西的秆撮,那么33個(gè)字節(jié)四濒,大家可以想得到分別拿來放什么呢?其中肯定有32個(gè)字節(jié)职辨,是用來放(Int,Int,Int,Int)這個(gè)家伙盗蟆,那么最后一個(gè)字節(jié),應(yīng)該是拿來放other這個(gè)家伙舒裤。
40這個(gè)內(nèi)存不是32 + 8喳资, 也就是說,我們最終算出來的這個(gè)40腾供,不是32 + 8骨饿。
這個(gè)40是怎么來的?首先你先存儲(chǔ)這4個(gè)家伙(Int,Int,Int,Int) 台腥,那你肯定要32個(gè)字節(jié),other這個(gè)家伙其實(shí)用1個(gè)字節(jié)就搞定了绒北,所以你真正要用到的就是33個(gè)字節(jié)黎侈,但是由于我們這個(gè)alignment內(nèi)存對(duì)齊呢,是8闷游,所以你要保證最終分配給你的內(nèi)存大小是8的倍數(shù)峻汉,所以說33不夠贴汪,要補(bǔ)齊為40。所以休吠,最終分給你的是40扳埂。