Sizeofslice
/**
type SliceHeader struct{
Data uintptr //8
Lenint //8
Capint //8
}
string
为8+8type StringHeader struct{
Data uintptr //8
Len int//8
}
array
为size(Type)*len,简单总结如下 。typealignment guarantee
------------
bool, uint8, int81
uint16, int162
uint32, int324
float32, complex644
arraysdepend on element types
structsdepend on field types
other typessize of a native word
内存对齐及可视化工具
//main.go
package maintype user struct {
namestring
ageint
genderint
isBuybool
hobbies []string
}
type sliceCopy struct {
sInt[]int
sString []int
}func main() {}
依次执行
structlayout -json ./main.go sliceCopy| structlayout-svg -t "sliceCopy" > sliceCopy.svg
structlayout -json ./main.go user | structlayout-svg -t "user" > user.svg
产出物为两个svg文件
文章图片
文章图片
如果不想看svg,还可以直接看ascii版本,需要以下命令
bogon:sizeOfCommonType w$ structlayout -json ./main.go user | structlayout-pretty
【golang 中Sizeof函数 与内存对齐查看的方式】输出如下:
+--------+
0 || <- user.name string (size 16, align 8)
+--------+
-........-
+--------+
15 ||
+--------+
16 || <- user.age int (size 8, align 8)
+--------+
-........-
+--------+
23 ||
+--------+
24 || <- user.gender int (size 8, align 8)
+--------+
-........-
+--------+
31 ||
+--------+
32 || <- user.isBuy bool (size 1, align 1)
+--------+
33 || <- padding (size 7, align 0)
+--------+
-........-
+--------+
39 ||
+--------+
40 || <- user.hobbies []string (size 24, align 8)
+--------+
-........-
+--------+
63 ||
+--------+
所需包
go get -u honnef.co/go/tools
//显示结构体布局
go install honnef.co/go/tools/cmd/structlayout@latest
//重新设计struct字段 减少填充的数量
go install honnef.co/go/tools/cmd/structlayout-optimize@latest
// 用ASCII格式输出
go install honnef.co/go/tools/cmd/structlayout-pretty@latest
//第三方可视化
go install github.com/ajstarks/svgo/structlayout-svg@latest
后续思考:
- 内存对齐的目的(使我们可以开发出更高效的代码,使得cpu可高效访问内存数据,)
- 结构体内存对齐的基本原则(小在前,大在后; 空struct放在前面还是后面)
- 不同cpu硬件及不同os在32位和64位系统如何兼容和实现原子指令的问题(aotmic包&?)