返回信息流最近在学习malloc.go的代码,没太理解下面的对其是怎么弄的。
```go
// Align tiny pointer for required (conservative) alignment.
if size&7 == 0 {
off = round(off, 8)
} else if size&3 == 0 {
off = round(off, 4)
} else if size&1 == 0 {
off = round(off, 2)
}
```
为什么满足 size&7 == 0 这个条件的就是 size > 8,将按照8B对齐呢?
```go
for i := 1; i <= 16; i++ {
if i&7 == 0 {
fmt.Printf("%d:i&7 == 0\n", i)
} else if i&3 == 0 {
fmt.Printf("%d:i&3 == 0\n", i)
} else if i&1 == 0 {
fmt.Printf("%d:i&1 == 0\n", i)
}
}
output:
2:i&1 == 0
4:i&3 == 0
6:i&1 == 0
8:i&7 == 0
10:i&1 == 0
12:i&3 == 0
14:i&1 == 0
16:i&7 == 0
```
这是一条镜像帖。来源:北邮人论坛 / golang / #1182同步于 2018/8/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
请教一个关于位操作的问题
limingji0503
2018/8/22镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
x % (2 ^N) == x & (2 ^N -1) 这个我懂,
但是我看好多人的翻译,
```golang
if size&7 == 0 {
off = round(off, 8)
}
```
的意思是大于8B的按照8B对齐,但是size&7==0的时候,size不就等于8或者16吗?size = 9. 10....15的时候size&7 也不等于0呐
【 在 Nroskill 的大作中提到: 】
: x % (2^N) == x & (2^N - 1)
: 哈希表里常用的手段
首先,按8B对齐是啥意思
【 在 limingji0503 的大作中提到: 】
: x % (2 ^N) == x & (2 ^N -1) 这个我懂,
: 但是我看好多人的翻译,
: [md]
: ...................
不懂go,但是我猜想默认情况下无需按照更大的位数对齐
按照你的逻辑,比如考虑极端情况,申请1G内存,要按照1 << 30对齐,但这样太浪费了,极端情况会浪费1<<30 - 1个字节
如果只到8,最多也就浪费7个字节
【 在 limingji0503 的大作中提到: 】
: x % (2 ^N) == x & (2 ^N -1) 这个我懂,
: 但是我看好多人的翻译,
: [md]
: ...................
round(off, 2^N)说得是将buffer pointer按照虚拟地址的坐标2的幂次对齐吧...没看到前边代码不太肯定,猜测offset值不一定指向2^N地址
【 在 limingji0503 的大作中提到: 】
: [md]
: 最近在学习malloc.go的代码,没太理解下面的对其是怎么弄的。
: ```go
: ...................
【 在 Nroskill 的大作中提到: 】
: 不懂go,但是我猜想默认情况下无需按照更大的位数对齐
: 按照你的逻辑,比如考虑极端情况,申请1G内存,要按照1 << 30对齐,但这样太浪费了,极端情况会浪费1<<30 - 1个字节
: 如果只到8,最多也就浪费7个字节
: ...................
的确会造成浪费。但go 只是对小对象(16B)以下的对象才这样进行分配。