MAY-Lesson 1

筆記 - unsafe

Package unsafe contains operations that step around the type safety of Go programs.

Packages that import unsafe may be non-portable and are not protected by the Go 1 compatibility guidelines.

unsafe 庫讓 golang 可以像C語言一樣操作計(jì)算機(jī)內(nèi)存,但這并不是golang推薦使用的,能不用盡量不用,就像它的名字所表達(dá)的一樣,它繞過了golang的內(nèi)存安全原則,是不安全的,容易使你的程序出現(xiàn)莫名其妙的問題,不利于程序的擴(kuò)展與維護(hù)。

unsafe.Sizeof

Sizeof takes an expression x of any type and returns the size in bytes of a hypothetical variable v as if v was declared via var v = x.? The size does not include any memory possibly referenced by x.

For instance, if x is a slice, Sizeof returns the size of the slice descriptor, not the size of the memory referenced by the slice. The return value of Sizeof is a Go constant.

func Sizeof(x ArbitraryType) uintptr

unsafe.Sizeof接受任意類型的值(表達(dá)式),返回其占用的字節(jié)數(shù),? 這個(gè)大小標(biāo)識(shí)類型存儲(chǔ)大小,和類型對(duì)應(yīng)的變量存儲(chǔ)的內(nèi)容大小無關(guān). 如果x為一個(gè)切片,sizeof返回的大小是切片的描述符,而不是切片所指向的內(nèi)存的,對(duì)于數(shù)組來說,sizeof(arr)的值是在隨著arr的元素的個(gè)數(shù)的增加而增加

Sizeof函數(shù)返回的值,對(duì)于基礎(chǔ)數(shù)據(jù)類型來說是系統(tǒng)可以預(yù)分配給該類型變量占用的字節(jié)數(shù),對(duì)于字符串類型,引用類型和結(jié)構(gòu)體等聚合類型來說只包括數(shù)據(jù)結(jié)構(gòu)中固定的部分,例如字符串對(duì)應(yīng)結(jié)構(gòu)體中的指針和字符串長度部分,但是并不包含指針指向的字符串的內(nèi)容。Go語言中非聚合類型通常有一個(gè)固定的大小,盡管在不同工具鏈下生成的實(shí)際大小可能會(huì)有所不同??紤]到可移植性,引用類型或包含引用類型的大小在32位平臺(tái)上是4個(gè)字節(jié),在64位平臺(tái)上是8個(gè)字節(jié)。

bool 類型雖然只有一位,但也需要占用1個(gè)字節(jié),因?yàn)橛?jì)算機(jī)是以字節(jié)為單位64為的機(jī)器,一個(gè) int 占8個(gè)字節(jié)string 類型占16個(gè)字節(jié),內(nèi)部包含一個(gè)指向數(shù)據(jù)的指針(8個(gè)字節(jié))和一個(gè) int 的長度(8個(gè)字節(jié))slice 類型占24個(gè)字節(jié),內(nèi)部包含一個(gè)指向數(shù)據(jù)的指針(8個(gè)字節(jié))和一個(gè) int 的長度(8個(gè)字節(jié))和一個(gè) int 的容量(8個(gè)字節(jié))map 類型占8個(gè)字節(jié),是一個(gè)指向 map 結(jié)構(gòu)的指針可以用 struct{} 表示空類型,這個(gè)類型不占用任何空間,用這個(gè)作為 map 的 value,可以將 map 當(dāng)做 set 來用


不論字符串的len有多大,sizeof始終返回16,這是為啥,字符串不是也是不可變的嗎?

type stringStruct struct { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????str unsafe.Pointer ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????len int ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

}

字符串使用 16 字節(jié)長的數(shù)據(jù)結(jié)構(gòu)表示,包含一個(gè)指向字符串存儲(chǔ)數(shù)據(jù)的指針和一個(gè)長度數(shù)據(jù)。采用字符串切片生成新的字符串的時(shí)候不會(huì)涉及到內(nèi)存的分配和復(fù)制操作,因?yàn)槎鄠€(gè)字符串重用了底層的存儲(chǔ)數(shù)據(jù),因?yàn)樽址遣豢勺兊模ǜ淖冏址畷?huì)生成新的字符串),不會(huì)有內(nèi)存共享問題。Go 使用 utf-8 編碼字符串,(utf-8編碼作者是 Go 作者之一),Go 的字符串每一個(gè)字符是 rune,rune 是 uint32 的別名,unicode 字符的長度可能是1,2,3,4個(gè)字節(jié)。如果統(tǒng)計(jì)字?jǐn)?shù)算的是 rune。

常用數(shù)據(jù)類型對(duì)應(yīng)的存儲(chǔ)字節(jié)大小(Sizeof輸出):


最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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