结构体的内存

结构体内存

一、概念

结构体占的是一片连续的内存空间,大小由其变量类型决定

二、结构体内存布局

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个呢?
---->这就要涉及到结构体中的内存对齐了

  1. 由概念可知道------大小由其变量类型决定------所以按照变量类型算结构体的内存时结果是这样子的
    在这里插入图片描述

  2. 但实际上变量在结构体中的内存分布是这样子的
    在这里插入图片描述
    总共占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个字节
}

总结

所以以后我们可以通过移动结构体中变量的顺序位置,来达到优化结构体内存大小的目的。

你可能感兴趣的:(go语言)