unsafe标准库包

func Alignof(variable ArbitraryType) uintptr。 此函数用来取得一个值在内存中的地址对齐保证(address alignment guarantee)。 注意,同一个类型的值做为结构体字段和非结构体字段时地址对齐保证可能是不同的。 当然,这和具体编译器的实现有关。对于目前的标准编译器(go 1.18),同一个类型的值做为结构体字段和非结构体字段时的地址对齐保证总是相同的。 gccgo编译器对这两种情形是区别对待的。

package main

import (
"fmt"
"unsafe"
) func main() {
var x struct {
a int64
b bool
c string
}
fmt.Println(unsafe.Alignof(x.a)) //8
fmt.Println(unsafe.Alignof(x.b)) //1
fmt.Println(unsafe.Alignof(x.c)) //8
}

地址对齐保证

为了充分使用CPU的指令并获得最佳性能,为给指定类型的值分配的内存块(起始)地址必须是一个整数N的倍数,则N称为该类型的值的(内存)地址对齐保证,或者简单的称为该类型的对齐保证。我们也可以说,这个类型的可寻址值的地址确保是N字节对齐的。

事实上,每种类型拥有两个对其保证,一种当它作为其他类型(struct)的字段,另一种是针对其他情况(如当它作为一个变量的声明,数组元素的类型等等)。我称前者为类型的字段对齐保证,而称后者为类型的一般对齐保证。

对于一种类型,我们可以调用unsafe.Algnof(t)去获取它的一般对齐保证,其中tT类型的无字段值,也可以调用unsafe.Algnof(x.t)去获取它字段的对齐保证,其中x是一个struct的值,同时a是类型T的字段值。

标准库unsafe中的函数调用总是在编译期间。

在运行期间,对于类型T的值,我们可以调用reflect.TypeOf(t).Align()去获取类型T的一般对齐保证,也可以调用reflect.TypeOf(t).FieldAlign()去获取类型T字段的一般对齐保证。

go 地址对齐保证的更多相关文章

  1. C语言精要总结-内存地址对齐与struct大小判断篇

    在笔试时,经常会遇到结构体大小的问题,实际就是在考内存地址对齐.在实际开发中,如果一个结构体会在内存中高频地分配创建,那么掌握内存地址对齐规则,通过简单地自定义对齐方式,或者调整结构体成员的顺序,可以 ...

  2. C语言地址对齐(转)--网络编程之结构体大小的计算

    什么是地址对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数 ...

  3. c++地址对齐

    在一些计算机上,由于性能方面的原因,2个字节的变量,必须放在2的倍数的地址中,4个字节的,就必须放在4的倍数中的地址中,以此类推. 也就是说,如果有3个占用两个字节的变量,分别为:A,B,C,如下图: ...

  4. 浅谈MIPS地址对齐问题

    1.什么叫地址对齐? RISC 下使用访存指令读取或写入数据单元时,目标地址必须是所访问之数据单元字节数的整数倍,这个叫做地址对齐. 2.计算机主要的架构分哪两类?及其地址对齐在两者的区别? 计算机主 ...

  5. C语言结构体变量内存分配与地址对齐

    地址对齐简单来说就是为了提高访问内存的速度. 数组的地址分配比较简单,由于数据类型相同,地址对齐是一件自然而然的事情. 结构体由于存在不同基本数据类型的组合,所以地址对齐存在不同情况,但总体来说有以下 ...

  6. 关于AVALON总线动态地址对齐

    在NIOS的使用中,我们往往要用到自定义外设,然后通过AVALON交换架构和NIOSII进行通信. AVALON总线,其实是一种交换架构的协议,在自定义外设挂在AVALON总线上时,一定要注意地址对齐 ...

  7. (原创)Linux下一定要4字节地址对齐操作

    Linux下一定要4字节地址对齐操作:“血”的教训,一定不要忘记!!! 当然不仅仅是Linux下,所有的32位机都应该如此!!!

  8. 嵌入式C语言自我修养 07:地址对齐那些事儿

    7.1 属性声明:aligned GNU C 通过 __atttribute__ 来声明 aligned 和 packed 属性,指定一个变量或类型的对齐方式.这两个属性用来告诉编译器:在给变量分配存 ...

  9. NIOS II 自定义IP核的静态地址对齐和动态地址对齐

    如果使用静态地址对齐(每个寄存器在Avalon总线上占4个字节的地址)设置IP使用静态地址对齐的方式为,在hw.tcl脚本里加上一局话:set_interface_property as addres ...

  10. 09.C语言:预处理(宏定义)、字节序、地址对齐

    一.预处理 预处理 gcc -E Hello.c -o hello.i 编译 gcc -S hello.i -o hello.s 汇编 gcc -c hello.s -o hello.o 链接 gcc ...

随机推荐

  1. 前后端分离模式下Java Web开发中的技术栈概图

    参考链接1:前后端的分离模式 参考链接2:浅谈前后端分离开发模式 参考链接3:前后端分离开发模式介绍

  2. Python 抽象基类 ABC :从实践到优雅

    今天我们来聊聊 Python 中的抽象基类(Abstract Base Class,简称 ABC).虽然这个概念在 Python 中已经存在很久了,但在日常开发中,很多人可能用得并不多,或者用得不够优 ...

  3. 痛苦调优10小时,我把 Spark 脚本运行时间从15小时缩短到12分钟!

    周一我就有个困惑,还写成文章了:如何从 Spark 的 DataFrame 中取出具体某一行,里面提了自己猜想的几种解决方案. 没想到这么快就要面对这个问题了,我用小孩子都听得懂的例子描述一下我在干什 ...

  4. docker导入和导出

    save和export 镜像导入和导出有2种方式,分别为 save和load.export和import save导出的是镜像:export导出的为容器 save导出会保存镜像所有的提交记录:expo ...

  5. C# 窗口鼠标穿透以及取消窗口鼠标穿透

    private const int WS_EX_TRANSPARENT = 0x20; private const int GWL_EXSTYLE = -20; /// <summary> ...

  6. 15个Linux Grep命令使用实例(实用、常用)

    Grep命令主要用于从文件中查找指定的字符串.首先建一个demo_file: 复制代码 代码如下: $ cat demo_fileTHIS LINE IS THE 1ST UPPER CASE LIN ...

  7. Activiti、Flowable和Camunda选型和对比

    https://camunda.com/https://www.jianshu.com/p/5942c4ee513chttps://zhuanlan.zhihu.com/p/484107368http ...

  8. G1原理—9.如何优化G1中的MGC

    大纲 1.大对象导致频繁Mixed GC的案例 2.Mixed GC到底是在优化什么(从避免到提速) 3.Mixed GC相关参数详解之堆内存分配参数 4.Mixed GC其他相关的参数详解及优化 1 ...

  9. linux:init

    init命令启动级别的含义(0-6) 0:停机1:单用户形式,只root进行维护2:多用户,不能使用net file system3:完全多用户4:未使用(系统之间可能略有不同,有些人的博客写的是安全 ...

  10. 微信小程序安全开发、测试的一些记录

    目录 开发原则 漏洞类型--越权 漏洞类型--信息泄露 漏洞类型--爬虫遍历 漏洞类型--授权用户信息变更不跟进 漏洞类型--注入类 漏洞类型--上传.下载类 Reference 本文基于微信开发者平 ...