计算机中为什么需要数据对齐?
-数据对齐之后可以提高处理器从内存中读取数据的效率。例如,4个字节的整数类型如果从奇数地址开始存储,那么处理器需要两次读取才能将该整数读出,如果从是其倍数的地址开始读取,则只需读取一次,这样对处理起来说开销更小。
数据对齐规则:
- 每个数据类型的起始地址应该为此数据类型所占字节数的整数倍。
- 对于结构体类型的数据,数据所占字节数应该为结构体内字段的最大对齐数,也就是占字节数最多的数据类型。
因此,大多数情况下,应该使得所声明的结构体类型所占字节数最少。
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)