zoukankan      html  css  js  c++  java
  • go 内存对齐

    go 内存对齐

    前言

    学过操作系统的人知道,OS为了CPU读取方便会一次性读取一块的单位,这个块的开大小又称为内存访问粒度

    在64位系统中,这个粒度为8,也就是一次性读取8个字节。

    unsafe.Sizeof()  //返回传入参数的大小
    unsafe.Alignof() //返回对齐参数
    

    对齐规则

    1. 结构体的成员变量,第一个成员变量的偏移量为 0。往后的每个成员变量的对齐值必须为编译器默认对齐长度#pragma pack(n))或当前成员变量类型的长度unsafe.Sizeof),取最小值作为当前类型的对齐值。其偏移量必须为对齐值的整数倍

    2. 结构体本身,对齐值必须为8的最小整数倍

    结合以上两点,可得知若编译器默认对齐长度#pragma pack(n))超过结构体内成员变量的类型最大长度时,默认对齐长度是没有任何意义的

    操作

    我们先来看下两个结构体,他们的成员是相同的,但是排列顺序不一样。这些成员的大小加起来都是15字节。

    type q1 struct {
    	a bool   //1
    	b int32   //4
    	c int8   //1
    	d int64  //8
    	e byte   //1
    }
    
    type q2 struct {
    	e byte  //1
    	c int8  //1
    	a bool  //1
    	b int32 //4
    	d int64  //8
    }
    

    现在,我们输出这两个结构体的大小,他们会一样吗?

    	q1 := q1{}
    	q2 := q2{}
    
    	fmt.Printf("q1 size :%d,align:%d
    ",unsafe.Sizeof(q1),unsafe.Alignof(q1))
    	fmt.Printf("q2 size :%d,align:%d
    ",unsafe.Sizeof(q2),unsafe.Alignof(q2))
    
    	//output
    //	q1 size :32,align:8
    //	q2 size :16,align:8
    

    差异很大,这个差异就是由于内存对齐导致的。接下来,我们来看下这个差异如何构成的。

    q1在内存中的排列如下,-符号代表因内存对齐而浪费的字节。

    a---bbbc---dddddddde---   共计32个字节
    

    q2在内存中排列如下:

    abc-bbbdddddddd 共计16字节
    
  • 相关阅读:
    根据表1更新表2的数据
    sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表
    sql server 2008 将某表里的数据随机插入另一个表表
    用SqlBulkCopy批量插入数据
    Win7 下如何添加任务计划呢
    20180320作业1:源代码管理工具调查 Polonium
    判断传入的电子邮箱账号的正确性 Polonium
    Java工厂方法模式 Polonium
    软工课后作业01 Polonium
    Java实现简单工厂模式
  • 原文地址:https://www.cnblogs.com/Jun10ng/p/12811084.html
Copyright © 2011-2022 走看看