data alignment

计算机中为什么需要数据对齐?
-数据对齐之后可以提高处理器从内存中读取数据的效率。例如,4个字节的整数类型如果从奇数地址开始存储,那么处理器需要两次读取才能将该整数读出,如果从是其倍数的地址开始读取,则只需读取一次,这样对处理起来说开销更小。
数据对齐规则:
  1. 每个数据类型的起始地址应该为此数据类型所占字节数的整数倍。
  2. 对于结构体类型的数据,数据所占字节数应该为结构体内字段的最大对齐数,也就是占字节数最多的数据类型。
因此,大多数情况下,应该使得所声明的结构体类型所占字节数最少。

e.g.

package main

import (
    "fmt"
    "unsafe"
)

type structA struct {
    a byte
    b int16
}

type structB struct {
    a int16
    b byte
    c int32
}

type structC struct {
    a byte
    b int64
    c int32
}

type structD struct {
    a int64
    b int32
    c byte
}

func main() {
    fmt.Printf("sizeof(structA) = %d\n", unsafe.Sizeof(structA{}))
    fmt.Printf("sizeof(structB) = %d\n", unsafe.Sizeof(structB{}))
    fmt.Printf("sizeof(structC) = %d\n", unsafe.Sizeof(structC{}))
    fmt.Printf("sizeof(structD) = %d\n", unsafe.Sizeof(structD{}))
}

output:
sizeof(structA) = 4                1 + pad(1) + 2
sizeof(structB) = 8                2 + 1 + pad(1) + 4
sizeof(structC) = 24              1 + pad(7) + 8 + 4 + pad(4)
sizeof(structD) = 16              8 + 4 + 1 + pad(3)
对于struct类型中包含struct类型的情况,将struct中的字段类型全部转换成基本的数据类型,然后计算。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,197评论 6 13
  • @[c++|struct] 今天在编程中碰到一个坑,搞的调试了半天,最后发现程序中在写数据和读取数据时结构体定义不...
    drybeans阅读 3,634评论 1 11
  • 转载 结构体对齐详解 结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会...
    erU阅读 487评论 0 3
  • Words: happy: glad, excited, pleased, tasty: yummy, delic...
    享悦moonlight阅读 161评论 0 0
  • 曾经,那个永远在远处望着他的少女,走过一路樱花,簪着芬芳的洁白花朵,站在他面前,温柔的微笑。 “你可以留下来吗?”...
    月下旬阅读 272评论 0 0