求问这段代码为什么运行结果是40,内存对齐问题?

MrDoubleU · 2018-01-05 18:30:10 · 1076 次点击
[]int 大小为 3uintptr64位系统的话是24字节
a byte 大小为1字节
c byte 大小位1字节

一共是 26,但是我觉得是因为你的书写导致内存分配是这样的

| ---a-------补全8字节|
| ---b-------8字节 array------|
| ---b-------8字节 len------|
| ---b-------8字节 cap-----|
| ---c-------补全8字节|
#1
更多评论
package main

import (
    "fmt"
    "unsafe"
)

func main() {
    v3 := struct {
        a byte
        b []int
        c byte
    }{}
    fmt.Println(unsafe.Sizeof(v3))
    fmt.Println(unsafe.Sizeof(v3.a))
    fmt.Println(unsafe.Sizeof(v3.b))
    fmt.Println(unsafe.Sizeof(v3.c))

    fmt.Println("------------------")

    v4 := struct {
        b []int
        a byte
        c byte
    }{}
    fmt.Println(unsafe.Sizeof(v4))
    fmt.Println(unsafe.Sizeof(v4.a))
    fmt.Println(unsafe.Sizeof(v4.b))
    fmt.Println(unsafe.Sizeof(v4.c))

    fmt.Println("------------------")

    v5 := struct {
        a byte
        c byte
        b []int
    }{}
    fmt.Println(unsafe.Sizeof(v5))
    fmt.Println(unsafe.Sizeof(v4.a))
    fmt.Println(unsafe.Sizeof(v4.b))
    fmt.Println(unsafe.Sizeof(v4.c))
}

输出

40
1
24
1
------------------
32
1
24
1
------------------
32
1
24
1

可以看出来结构体中相同类型的字段最好同时连续声明,可能会节省一些内存

#2

好的懂了,非常感谢

#3