GO語言 記憶體對齊

2021-10-18 03:37:02 字數 1411 閱讀 2815

32位系統,一次可以取32位資料,也就是4位元組,64位是8位元組,即32為作業系統中記憶體是4位元組對齊,而對於64為作業系統是8位元組對齊

記憶體對齊的目的是為了能夠快速的訪問記憶體進行資料訪問,但是會損耗記憶體,即空間換時間

首先:

package main

import (

"fmt"

"reflect"

"unsafe"

)type w struct

func main()

//在struct中,它的對齊值是它的成員中的最大對齊值。

fmt.printf("%v, %v, %v, %v, %v, %v, %v, %v\n", unsafe.alignof(w), unsafe.alignof(w.b), unsafe.alignof(w.i), unsafe.alignof(w.j),

unsafe.sizeof(w), unsafe.sizeof(w.b), unsafe.sizeof(w.i), unsafe.sizeof(w.j))

}

d:\go-project\pkg\demo>go run demo.go

8, 1, 4, 8, 16, 1, 4, 8

可以看出上述**跑出來的結果是最大8位元組對齊的即64為作業系統,其中b為1位元組對齊、i為4位元組對齊,j為8位元組對齊,其中w為結構體內引數最大的引數做記憶體對齊,而sizeof計算的是結構體一共占用多少位元組數,這裡面的計算就涉及到記憶體對齊,首先計算引數b和i,這兩個引數總和加起來少於w結構體的記憶體對齊的位元組數,所以這兩個位元組占用8位元組,而j占用8位元組,那麼w一共16位元組

但是如果結構體是下面這樣寫的:

type w struct
那麼i佔8個位元組,j佔8個位元組,b佔8個位元組,一共24個位元組數

下面來聊聊記憶體對齊最底層原理:

首先針對64位定址的記憶體,乙個記憶體是由若干個黑色的記憶體顆粒構成的。每乙個記憶體顆粒叫做乙個chip。每個chip內部,是由8個bank組成的,如果是32位就是4片,如下:

而每乙個bank是乙個二維平面上的矩陣,矩陣中每乙個元素中都是儲存了1個位元組,也就是8個bit。

記憶體中的8個bank是可以並行工作的,即當我們定址0x0000-0x0007時,定址的是下面8*8=64bit,如果是0x0000時,我們只讀取blank0上的乙個位元組,那麼如果讀0x0003的時候那麼就變成了0x0000+3兩次定址

GO 記憶體對齊

之前遇到過這樣乙個情況 發現問題的結構體並不長這樣,不過為了引出問題,改了一下 type test structfunc main fmt.printf d unsafe.sizeof t 建立乙個結構體,檢視一下其記憶體占用.看結果前先簡單算一下 這麼算下來的話,test結構體占用應該是 1 4 ...

Go記憶體對齊

fmt.println unsafe.sizeof int64 0 8 type sizeofa struct unsafe.sizeof sizeofa 8 type sizeofc struct unsafe.sizeof sizeofc 8 unsafe.alignof sizeofc 4 結...

C語言 位元組對齊(記憶體對齊)

1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常 2 硬體原因 經過記憶體對齊之後,cpu的記憶體訪問速度大大提公升。1.對齊原則 原則1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,...