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

MrDoubleU · 2018-01-05 18:30:10 · 1105 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-01-05 18:30:10 的主题,其中的信息可能已经有所发展或是发生改变。

package main

import ( "fmt" "unsafe" )

func main(){ v3:= struct { a byte b []int c byte }{} fmt.Printf("%d",unsafe.Sizeof(v3)) }


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1105 次点击  
加入收藏 微博
3 回复  |  直到 2018-01-15 19:53:55
leavesdrift
leavesdrift · #1 · 7年之前
[]int 大小为 3uintptr64位系统的话是24字节
a byte 大小为1字节
c byte 大小位1字节

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

| ---a-------补全8字节|
| ---b-------8字节 array------|
| ---b-------8字节 len------|
| ---b-------8字节 cap-----|
| ---c-------补全8字节|
leavesdrift
leavesdrift · #2 · 7年之前
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

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

MrDoubleU
MrDoubleU · #3 · 7年之前
leavesdriftleavesdrift #1 回复

```go []int 大小为 3个uintptr, 64位系统的话是24字节 a byte 大小为1字节 c byte 大小位1字节 一共是 26,但是我觉得是因为你的书写导致内存分配是这样的 | ---a-------补全8字节| | ---b-------8字节 array------| | ---b-------8字节 len------| | ---b-------8字节 cap-----| | ---c-------补全8字节| ```

好的懂了,非常感谢

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传