结构体内存
一、概念
结构体占的是一片连续的内存空间,大小由其变量类型决定
二、结构体内存布局
1、变量类型相同时
type nums struct {
a int //8字节
b int //8
c int //8
}
func main(){
var zNums nums
fmt.Printf("%d", unsafe.Sizeof(zNums))//24个字节
}
此时结构体中各变量的内存大小是相同的,一共为24个字节,但是字段类型也有不相同的时候,如下点。
2、变量类型不相同
type nums struct {
a int16 //2
b int //8字节
c int8 //1
}
func main(){
var zNums nums
fmt.Printf("%d", unsafe.Sizeof(zNums))//24个字节
}
为什么明明结构体中的单个变量的字节加起来才11个字节-----可为什么结构体占的字节数却为24个呢?
---->这就要涉及到结构体中的内存对齐了
-
由概念可知道------大小由其变量类型决定------所以按照变量类型算结构体的内存时结果是这样子的
-
但实际上变量在结构体中的内存分布是这样子的
总共占24个字节
那这是为什么呢?
1、因为 CPU 访问内存时,并不是逐个字节访问,而是以字(word)为单位访问。
2、比如 64位CPU的字长(word size)为8bytes,那么CPU访问内存的单位也是8字节,每次加载的内存数据也是固定的若干字长,如8words(64bytes)、16words(128bytes)等。
我在多举几个例子吧
type nums struct {
a int16 //2
b int8 //1
c int //8字节
}
func main(){
var zNums nums
fmt.Printf("%d", unsafe.Sizeof(zNums))//16个字节
}
type nums struct {
c int32 //4
a int8 //1
b int //8字节
}
func main(){
var zNums nums
fmt.Printf("%d", unsafe.Sizeof(zNums))//16个字节
}
总结
所以以后我们可以通过移动结构体中变量的顺序位置,来达到优化结构体内存大小的目的。