go 地址对齐保证
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)去获取它的一般对齐保证,其中t是T类型的无字段值,也可以调用unsafe.Algnof(x.t)去获取它字段的对齐保证,其中x是一个struct的值,同时a是类型T的字段值。
标准库unsafe中的函数调用总是在编译期间。
在运行期间,对于类型T的值,我们可以调用reflect.TypeOf(t).Align()去获取类型T的一般对齐保证,也可以调用reflect.TypeOf(t).FieldAlign()去获取类型T字段的一般对齐保证。
go 地址对齐保证的更多相关文章
- C语言精要总结-内存地址对齐与struct大小判断篇
在笔试时,经常会遇到结构体大小的问题,实际就是在考内存地址对齐.在实际开发中,如果一个结构体会在内存中高频地分配创建,那么掌握内存地址对齐规则,通过简单地自定义对齐方式,或者调整结构体成员的顺序,可以 ...
- C语言地址对齐(转)--网络编程之结构体大小的计算
什么是地址对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数 ...
- c++地址对齐
在一些计算机上,由于性能方面的原因,2个字节的变量,必须放在2的倍数的地址中,4个字节的,就必须放在4的倍数中的地址中,以此类推. 也就是说,如果有3个占用两个字节的变量,分别为:A,B,C,如下图: ...
- 浅谈MIPS地址对齐问题
1.什么叫地址对齐? RISC 下使用访存指令读取或写入数据单元时,目标地址必须是所访问之数据单元字节数的整数倍,这个叫做地址对齐. 2.计算机主要的架构分哪两类?及其地址对齐在两者的区别? 计算机主 ...
- C语言结构体变量内存分配与地址对齐
地址对齐简单来说就是为了提高访问内存的速度. 数组的地址分配比较简单,由于数据类型相同,地址对齐是一件自然而然的事情. 结构体由于存在不同基本数据类型的组合,所以地址对齐存在不同情况,但总体来说有以下 ...
- 关于AVALON总线动态地址对齐
在NIOS的使用中,我们往往要用到自定义外设,然后通过AVALON交换架构和NIOSII进行通信. AVALON总线,其实是一种交换架构的协议,在自定义外设挂在AVALON总线上时,一定要注意地址对齐 ...
- (原创)Linux下一定要4字节地址对齐操作
Linux下一定要4字节地址对齐操作:“血”的教训,一定不要忘记!!! 当然不仅仅是Linux下,所有的32位机都应该如此!!!
- 嵌入式C语言自我修养 07:地址对齐那些事儿
7.1 属性声明:aligned GNU C 通过 __atttribute__ 来声明 aligned 和 packed 属性,指定一个变量或类型的对齐方式.这两个属性用来告诉编译器:在给变量分配存 ...
- NIOS II 自定义IP核的静态地址对齐和动态地址对齐
如果使用静态地址对齐(每个寄存器在Avalon总线上占4个字节的地址)设置IP使用静态地址对齐的方式为,在hw.tcl脚本里加上一局话:set_interface_property as addres ...
- 09.C语言:预处理(宏定义)、字节序、地址对齐
一.预处理 预处理 gcc -E Hello.c -o hello.i 编译 gcc -S hello.i -o hello.s 汇编 gcc -c hello.s -o hello.o 链接 gcc ...
随机推荐
- Karmada v1.12 版本发布!单集群应用迁移可维护性增强
本文分享自华为云社区<Karmada v1.12 版本发布!单集群应用迁移可维护性增强>,作者:云容器大未来. Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署 ...
- Qt编写可视化大屏电子看板系统17-柱状堆积图
一.前言 柱状堆积图也叫堆积柱状图.堆积柱形图.堆叠图,有点类似跳动的音符,一个柱子上有多根柱子层叠,层叠之间可以设置间隔,这个其实和柱状分组图的功能类似,只不过把这个分组放到了柱子上面层叠,一般柱子 ...
- Python包管理不再头疼:uv工具快速上手
Python 包管理生态中存在多种工具,如 pip.pip-tools.poetry.conda 等,各自具备一定功能. 而今天介绍的uv 是 Astral 公司推出的一款基于 Rust 编写的 Py ...
- RxSqlUtils(base R2dbc)
一.前言 随着 Solon 3.0 和 Solon-Rx 3.0 发布,又迎来了的 RxSqlUtils 扩展插件,用于"响应式"操作数据库.RxSqlUtils 是基于 R2db ...
- 关于vue加element-ui上传文件获取文件的sha256的值
首先使用element的上传文件的组件 安装依赖crypto-js npm i crypto-js <el-upload class="upload-demo" drag : ...
- Python 安装package 问题汇总
1. pip 命令使用国内源安装 pip install torch==1.8.1 -i https://mirrors.aliyun.com/pypi/simple/腾讯云: https://mir ...
- Solution Set -「Public NOIP Round #3 (Div. 1)」
\(\mathscr{A}\sim\) 移除石子 Tags:「A.构造」「C.细节」 "显然" 直接按 \((x,y)\) 二元组排序后两两组成正方形! 喜提 \(90\t ...
- Kotlin:【异常处理】自定义异常、先决条件函数
- mysql异常处理的收集
今天在处理mysql的存储过程,判断游标是否到了结尾,结果让返回零行的一个查询触发了,随即从网上查阅资料收集异常异常处理. MySql错误处理(一)- SQL服务器模式 导言:MySql错误处理的基础 ...
- 解决ECharts官网打开缓慢的问题
本章我们将解决在Windows系统中打开ECharts官网缓慢的问题. 1.问题描述 正常情况下,我们在Windows环境中打开ECharts官网可能会遇到非常缓慢的情况,一直处于加载中,甚至打不开, ...