1. <dd id="erndk"></dd>
                1. Go圣經學習筆記——底層編程

                  互聯網 2022/4/29 11:12:45

                  Go底層編程 Go語言的語言特性, 隱藏許多細節:Go語言設計的一些安全機制將錯誤檢查提前到了編譯期,如類型檢查錯誤。數組越界、空指針等錯誤在運行時檢查,發現錯誤立即終止,通過Go的內存管理、gc可以消除大部分的野指針和內存泄漏。無法知道一個結構體真實的內存布局,也…

                  Go底層編程

                  Go語言的語言特性, 隱藏許多細節:

                  • Go語言設計的一些安全機制將錯誤檢查提前到了編譯期,如類型檢查錯誤。

                  • 數組越界、空指針等錯誤在運行時檢查,發現錯誤立即終止,通過Go的內存管理、gc可以消除大部分的野指針和內存泄漏。

                  • 無法知道一個結構體真實的內存布局,也無法獲取一個運行時函數對應的機器碼,也無法知道當前的goroutine是運行在哪個操作系統線程之上

                  • Go的調度器處理goroutine和線程的調度關系, gc會根據需要移動指針的內存地址。

                  有時候需要更好的性能, 這就設計底層的操作,unsafe可以擺脫Go的規則(正常不建議使用!), unsafe包由編譯器實現,供了一些訪問語言內部特性的方法,特別是內存布局相關的細節。被廣泛的使用在runtime、os、syscall還有net等涉及與os相關的包。

                  1.1 unsafe

                  1.1.1 unsafe.Sizeof()

                  • 返回操作數在內存的字節大小,參數可以是任意類型的表達式,不會對表達式進行求值。

                  • Sizeof函數調用是一個對應uintptr類型的常量表達式

                    import "unsafe"
                    fmt.Println(unsafe.Sizeof(float64(0))) // "8"
                    
                  • 返回的結果可以用作數組類型的長度大小,或者用作計算其他的常量。

                  • Sizeof函數返回的大小只包括數據結構中固定的部分,比如字符串對應結構體中的指針和字符串長度部分

                  • Go語言中非聚合類型通常有一個固定的大小,考慮到可移植性,引用類型或包含引用類型的大小在32位平臺上是4個字節,在64位平臺上是8個字節。

                    計算機在加載和保存數據時,如果內存地址合理地對齊的將會更有效率。例如2字節大小的int16類型的變量地址應該是偶數,一個4字節大小的rune類型變量的地址應該是4的倍數,一個8字節大小的float64、uint64或64-bit指針類型變量的地址應該是8字節對齊的。但是對于再大的地址對齊倍數則是不需要的,即使是complex128等較大的數據類型最多也只是8字節對齊。

                  • 聚合類型(結構體或數組)的大小至少是所有字段或元素大小的總和或者更大因為可能存在內存空洞。

                    內存空洞是編譯器自動添加的沒有被使用的內存空間,用于保證后面每個字段或元素的地址相對于結構或數組的開始地址能夠合理地對齊

                    內存空洞可能會存在一些隨機數據,可能會對用unsafe包直接操作內存的處理產生影響)。

                  • Go語言內置類型對應的大小

                  類型 大小
                  bool 1個字節
                  intN, uintN, floatN, complexN N/8個字節(例如float64是8個字節)
                  int, uint, uintptr 1個機器字
                  *T 1個機器字
                  string 2個機器字(data、len)
                  []T 3個機器字(data、len、cap)
                  map 1個機器字
                  func 1個機器字
                  chan 1個機器字
                  interface 2個機器字(type、value)
                  • Go語言的規范并沒有要求一個字段的聲明順序和內存中的順序是一致的,所以理論上一個編譯器可以隨意地重新排列每個字段的內存位置, 本書的時候編譯器還沒有這么做:

                                                   // 64-bit  32-bit
                    struct{ bool; float64; int16 } // 3 words 4words
                    struct{ float64; int16; bool } // 2 words 3words
                    struct{ bool; int16; float64 } // 2 words 3words
                    

                  1.1.2 unsafe.Alignof()

                  1.1.3 unsafe.Offsetof()

                  1.1.4 unsafe.Pointer()

                  1.2 cgo調用c代碼

                  1.3 總結

                  隨時隨地學軟件編程-關注百度小程序和微信小程序
                  關于找一找教程網

                  本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。
                  本站提供了軟件編程、網站開發技術、服務器運維、人工智能等等IT技術文章,希望廣大程序員努力學習,讓我們用科技改變世界。
                  [Go圣經學習筆記——底層編程]http://www.yachtsalesaustralia.com/tech/detail-317996.html

                  贊(0)
                  關注微信小程序
                  程序員編程王-隨時隨地學編程

                  掃描二維碼或查找【程序員編程王】

                  可以隨時隨地學編程啦!

                  技術文章導航 更多>
                  掃一掃關注最新編程教程
                  国产在线拍揄自揄视频菠萝

                        1. <dd id="erndk"></dd>