計(jì)算機(jī)中為什么需要數(shù)據(jù)對(duì)齊?
-數(shù)據(jù)對(duì)齊之后可以提高處理器從內(nèi)存中讀取數(shù)據(jù)的效率。例如,4個(gè)字節(jié)的整數(shù)類(lèi)型如果從奇數(shù)地址開(kāi)始存儲(chǔ),那么處理器需要兩次讀取才能將該整數(shù)讀出,如果從是其倍數(shù)的地址開(kāi)始讀取,則只需讀取一次,這樣對(duì)處理起來(lái)說(shuō)開(kāi)銷(xiāo)更小。
數(shù)據(jù)對(duì)齊規(guī)則:
- 每個(gè)數(shù)據(jù)類(lèi)型的起始地址應(yīng)該為此數(shù)據(jù)類(lèi)型所占字節(jié)數(shù)的整數(shù)倍。
- 對(duì)于結(jié)構(gòu)體類(lèi)型的數(shù)據(jù),數(shù)據(jù)所占字節(jié)數(shù)應(yīng)該為結(jié)構(gòu)體內(nèi)字段的最大對(duì)齊數(shù),也就是占字節(jié)數(shù)最多的數(shù)據(jù)類(lèi)型。
因此,大多數(shù)情況下,應(yīng)該使得所聲明的結(jié)構(gòu)體類(lèi)型所占字節(jié)數(shù)最少。
e.g.
package main
import (
"fmt"
"unsafe"
)
type structA struct {
a byte
b int16
}
type structB struct {
a int16
b byte
c int32
}
type structC struct {
a byte
b int64
c int32
}
type structD struct {
a int64
b int32
c byte
}
func main() {
fmt.Printf("sizeof(structA) = %d\n", unsafe.Sizeof(structA{}))
fmt.Printf("sizeof(structB) = %d\n", unsafe.Sizeof(structB{}))
fmt.Printf("sizeof(structC) = %d\n", unsafe.Sizeof(structC{}))
fmt.Printf("sizeof(structD) = %d\n", unsafe.Sizeof(structD{}))
}
output:
sizeof(structA) = 4 1 + pad(1) + 2
sizeof(structB) = 8 2 + 1 + pad(1) + 4
sizeof(structC) = 24 1 + pad(7) + 8 + 4 + pad(4)
sizeof(structD) = 16 8 + 4 + 1 + pad(3)