最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你搞懂Golang結(jié)構(gòu)體內(nèi)存布局

 更新時(shí)間:2022年10月20日 08:58:53   作者:1個(gè)俗人  
結(jié)構(gòu)體在Go語言中是一個(gè)很重要的部分,在項(xiàng)目中會(huì)經(jīng)常用到。這篇文章主要帶大家看一下結(jié)構(gòu)體在內(nèi)存中是怎么分布的?通過對(duì)內(nèi)存布局的了解,可以幫助我們寫出更優(yōu)質(zhì)的代碼。感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助

前言

結(jié)構(gòu)體在Go語言中是一個(gè)很重要的部分,在項(xiàng)目中會(huì)經(jīng)常用到,大家在寫Go時(shí)有沒有注意過,一個(gè)struct所占的空間不一定等于各個(gè)字段加起來的空間之和,甚至有時(shí)候把字段的順序調(diào)整一下,struct的所占空間不一樣,接下來通過這篇文章來看一下結(jié)構(gòu)體在內(nèi)存中是怎么分布的?通過對(duì)內(nèi)存布局的了解,可以幫助我們寫出更優(yōu)質(zhì)的代碼。感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

結(jié)構(gòu)體內(nèi)存布局

結(jié)構(gòu)體大小

結(jié)構(gòu)體實(shí)際上就是由各種類型的數(shù)據(jù)組合而成的一種符合數(shù)據(jù)類型,一個(gè)結(jié)構(gòu)體變量的大小是由結(jié)構(gòu)體中的字段決定。結(jié)構(gòu)體和它所包含的數(shù)據(jù)在內(nèi)存中是以連續(xù)塊的形式存在的。我們可以借助unsafe.Sizeof方法,來獲取:

package main

import (
	"fmt"
	"unsafe"
)

type Test struct {
	T1 int8 // 1
	T2 int8 // 1
	T3 int8 // 1
}
func main() {
    var t Test
	fmt.Println(unsafe.Sizeof(t)) //3 bytes

}

內(nèi)存對(duì)齊

不同類型的變量占用內(nèi)存大小是不一樣的,但是cpu每次讀取的內(nèi)存長(zhǎng)度是固定的(比如cpu是64位的,一次可以從內(nèi)存中讀取64位的數(shù)據(jù),即8個(gè)字節(jié)),為了cpu能高效的讀寫數(shù)據(jù),編譯器會(huì)把各種類型的數(shù)據(jù)放在合適的地址,而不是順序的一個(gè)接一個(gè)的排放,并占用合適的長(zhǎng)度,這就是內(nèi)存對(duì)齊。每種類型的對(duì)齊值就是它的對(duì)齊邊界。

示例:

package main

import (
	"fmt"
	"unsafe"
)
type Test struct {
	a int8 // 1
	b int64 // 8
	c int32 // 4
}
type Test2 struct {
	a int8 // 1
	b int32 // 4
	c int64 // 8
}
func main() {
    var t Test
	fmt.Println(unsafe.Sizeof(t)) // 24
	var t2 Test2
	fmt.Println(unsafe.Sizeof(t2))// 16
}

通過上面示例,我們可以看到兩個(gè)結(jié)構(gòu)體中3個(gè)字段類型相同,當(dāng)排列順序發(fā)生變化時(shí),總的內(nèi)存大小也會(huì)發(fā)生變化。下面我們來一起分析一下:

如果沒有內(nèi)存對(duì)齊,那結(jié)構(gòu)體各個(gè)字段在內(nèi)存中是緊密排列的,如t1內(nèi)存布局示意圖如下:

因?yàn)閎這個(gè)字段需要8個(gè)字節(jié),所以會(huì)有一個(gè)字節(jié)的數(shù)據(jù)排列到第2個(gè)字中。如果程序想要讀取b字段的數(shù)據(jù),那么CPU需要兩次讀取才能獲取到完整的數(shù)據(jù),這樣就會(huì)影響了程序的性能。

所以,為了能讓CPU減少一次獲取的時(shí)間,Go編譯器會(huì)幫你把struct結(jié)構(gòu)體做數(shù)據(jù)的對(duì)齊,以便CPU可以一次將該數(shù)據(jù)從內(nèi)存中讀取出來。重新排列后內(nèi)存布局結(jié)構(gòu)示意圖如下:

其中有13個(gè)字節(jié)是真正存儲(chǔ)數(shù)據(jù)的,而灰色的11個(gè)字節(jié)則是為了對(duì)齊而填充上的,不存儲(chǔ)任何數(shù)據(jù),所以才會(huì)比沒有對(duì)齊排列時(shí)多出11個(gè)字節(jié)。

雖然通過對(duì)齊填充的方式提高了CPU讀寫數(shù)據(jù)的效率,但是這些填充內(nèi)存確實(shí)有點(diǎn)浪費(fèi)空間,那有沒有辦法既可以既可以做到內(nèi)存對(duì)齊保證CPU讀寫效率又能減少浪費(fèi)內(nèi)存空間呢?

那就是調(diào)整struct字段的順序,我們?cè)趤砜匆幌聇2結(jié)構(gòu)體的字段內(nèi)存布局結(jié)構(gòu)示意圖如下:

這樣重新排列后,只占了16個(gè)字節(jié),比上面那種方式少了8個(gè)字節(jié)。由此可知,對(duì)結(jié)構(gòu)體字段的重新排列會(huì)讓結(jié)構(gòu)體更節(jié)省內(nèi)。

總結(jié)

本篇文章我們一起學(xué)習(xí)了Go 語言中的內(nèi)存對(duì)齊,主要內(nèi)容如下:

  • 結(jié)構(gòu)體是占用一塊連續(xù)的內(nèi)存,一個(gè)結(jié)構(gòu)體變量的大小是由結(jié)構(gòu)體中的字段決定。
  • unsafe.Sizeof(x) 返回了變量x的內(nèi)存占用大小。
  • 兩個(gè)結(jié)構(gòu)體,即使包含變量類型的數(shù)量相同,但是位置不同,占用的內(nèi)存大小也不同,由此引出了內(nèi)存對(duì)齊。
  • 對(duì)結(jié)構(gòu)體字段的重新排列會(huì)讓結(jié)構(gòu)體更節(jié)省內(nèi)。

到此這篇關(guān)于一文帶你搞懂Golang結(jié)構(gòu)體內(nèi)存布局的文章就介紹到這了,更多相關(guān)Golang結(jié)構(gòu)體內(nèi)存布局內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go等待一組協(xié)程結(jié)束的操作方式

    go等待一組協(xié)程結(jié)束的操作方式

    這篇文章主要介紹了go等待一組協(xié)程結(jié)束的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言題解LeetCode下一個(gè)更大元素示例詳解

    Go語言題解LeetCode下一個(gè)更大元素示例詳解

    這篇文章主要為大家介紹了Go語言題解LeetCode下一個(gè)更大元素示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 深入理解Golang中WebSocket和WSS的支持

    深入理解Golang中WebSocket和WSS的支持

    本文主要介紹了深入理解Golang中WebSocket和WSS的支持,實(shí)現(xiàn)了Golang構(gòu)建WebSocket服務(wù)器和客戶端,并使用自簽名證書實(shí)現(xiàn)WSS的功能,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Go并發(fā)編程實(shí)踐

    Go并發(fā)編程實(shí)踐

    并發(fā)編程一直是Golang區(qū)別與其他語言的很大優(yōu)勢(shì),也是實(shí)際工作場(chǎng)景中經(jīng)常遇到的。近日筆者在組內(nèi)分享了我們常見的并發(fā)場(chǎng)景,及代碼示例,以期望大家能在遇到相同場(chǎng)景下,能快速的想到解決方案,或者是拿這些方案與自己實(shí)現(xiàn)的比較,取長(zhǎng)補(bǔ)短?,F(xiàn)整理出來與大家共享
    2017-01-01
  • go語言實(shí)現(xiàn)簡(jiǎn)易比特幣系統(tǒng)之交易簽名及校驗(yàn)功能

    go語言實(shí)現(xiàn)簡(jiǎn)易比特幣系統(tǒng)之交易簽名及校驗(yàn)功能

    這篇文章主要介紹了go語言實(shí)現(xiàn)簡(jiǎn)易比特幣系統(tǒng)之交易簽名及校驗(yàn)功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Go語言為什么很少使用數(shù)組原理解析

    Go語言為什么很少使用數(shù)組原理解析

    這篇文章主要為大家介紹了Go語言為什么很少使用數(shù)組原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go切片擴(kuò)容機(jī)制詳細(xì)說明和舉例

    Go切片擴(kuò)容機(jī)制詳細(xì)說明和舉例

    Go 語言中的切片是一種動(dòng)態(tài)數(shù)組,它可以自動(dòng)擴(kuò)容和縮容以適應(yīng)不同的數(shù)據(jù)量,這篇文章主要給大家介紹了關(guān)于Go切片擴(kuò)容機(jī)制詳細(xì)說明和舉例的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • go語言數(shù)據(jù)類型之字符串string

    go語言數(shù)據(jù)類型之字符串string

    這篇文章介紹了go語言數(shù)據(jù)類型之字符串string,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • VS Code配置Go語言開發(fā)環(huán)境的詳細(xì)教程

    VS Code配置Go語言開發(fā)環(huán)境的詳細(xì)教程

    這篇文章主要介紹了VS Code配置Go語言開發(fā)環(huán)境的詳細(xì)教程,本文通過實(shí)例代碼圖文相結(jié)合的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例

    Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例

    本篇文章主要介紹了Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05

最新評(píng)論

焦作市| 崇文区| 普安县| 项城市| 绥德县| 内丘县| 手游| 赞皇县| 廊坊市| 东城区| 洛川县| 哈巴河县| 闽侯县| 芜湖市| 晋中市| 庆阳市| 马山县| 郎溪县| 孙吴县| 鸡东县| 吉木乃县| 晋中市| 延川县| 来安县| 宜兴市| 渭源县| 崇义县| 英吉沙县| 高唐县| 永登县| 漠河县| 邢台县| 旬阳县| 东光县| 若羌县| 福州市| 浑源县| 左云县| 扶风县| 宜宾市| 达日县|