ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于2的n次幂对齐

2020-04-19 23:51:36  阅读:561  来源: 互联网

标签:反码 unsafe 补码 取整 关于 对齐 maxAlign hchan


应用场景

内存对齐时基本都会求关于n位对齐的向上取整

讲解

go1.13.8 中channel源码中有这样一个变量hchansize用来表示hchan(channel对应的实际结构体)所需大小(申请内存空间时,是根据hchansize给hchan申请对应大小的内存空间),这个变量的值大概就是hchan的size关于maxAlign向上取整下一个较大倍数,看到源码实现时,就感觉真是怪物。

hchanSize = unsafe.Sizeof(hchan{}) + uintptr(-int(unsafe.Sizeof(hchan{}))&(maxAlign-1))

为了方便将上述表达式简化为 n + ( (-n) & (a - 1)),n是unsafe.Sizeof(hchan{}),a是maxAlign。等价于 n + (a - (n % a))

( (-n) & (a - 1) ) 等价 a - (n % a) ?

向上取整的问题实际可以转化为求出n距离下一个a的倍数差多少,然后n加上这个数就可以。

当a为2的n次幂时,n % a可以转化为 n & (a - 1),取模运算就变成了n与(a - 1) AND时能留下多少个1。

计算机实际计算时是以补码进行运算的,-n转化为补码,符号位不变其他位取反转化为反码,然后最低位+1转化为补码,下面分两步讲。

以n = 3, a = 8为例(实际计算时是8字节,下面用一字节举例):

原码: -n = 1000 0011
反码: -n = 1111 1100
此时(-n) & (a - 1)实际为 (a - 1) - n % a,而咱们要求的是a - (n % a)
补码:-n = 1111 1101
因为-n的反码变补码时最低位要+1,所以刚好(a - 1) - n % a + 1 = a - (n % a)

所以( (-n) & (a - 1) ) 等价 a - (n % a)

标签:反码,unsafe,补码,取整,关于,对齐,maxAlign,hchan
来源: https://www.cnblogs.com/wuwangchuxin0924/p/12735129.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有