Golang高效内存管理的任意位宽整数库
Golang高效内存管理的任意位宽整数库 我在Go语言中实现了一个内存高效的任意位宽整数数组类型,请查看GitHub - 1pkg/varint: VarInt: fast & memory efficient arbitrary bit width integers in Go.。
该库旨在提供一种内存占用最小的方式来使用和存储自定义位宽的整数。该库相当精简,但提供了基本的算术和位运算操作。该库的设计深受big.Int实现的影响。
1 回复
更多关于Golang高效内存管理的任意位宽整数库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这个库的设计思路很专业,通过紧凑的位存储实现内存高效。以下是一个典型的使用示例:
package main
import (
"fmt"
"github.com/1pkg/varint"
)
func main() {
// 创建位宽为5的整数数组(每个元素0-31)
arr := varint.NewArray(5, 10)
// 设置值
arr.Set(0, 15) // 二进制: 01111
arr.Set(1, 31) // 二进制: 11111
arr.Set(2, 7) // 二进制: 00111
// 获取值
val1 := arr.Get(0) // 15
val2 := arr.Get(1) // 31
// 算术运算
arr.Add(2, 10) // 7 + 10 = 17
arr.Sub(1, 5) // 31 - 5 = 26
// 位运算
arr.And(0, 0x0F) // 15 & 15 = 15
arr.Or(2, 0x10) // 17 | 16 = 17
fmt.Printf("元素0: %d\n", arr.Get(0))
fmt.Printf("元素1: %d\n", arr.Get(1))
fmt.Printf("元素2: %d\n", arr.Get(2))
// 内存占用对比
fmt.Printf("传统[]int32内存: %d bytes\n", 10*4)
fmt.Printf("VarInt数组内存: ~%d bytes\n", (5*10+7)/8)
}
关键特性实现示例:
// 位操作核心逻辑
func (a *Array) setBit(index uint, bit uint, value bool) {
pos := index*uint(a.bits) + bit
word := pos / 64
offset := pos % 64
if value {
a.data[word] |= 1 << offset
} else {
a.data[word] &^= 1 << offset
}
}
// 边界检查优化
func (a *Array) Get(i uint) uint64 {
if i >= a.length {
return 0
}
return a.readBits(i*uint(a.bits), a.bits)
}
性能对比测试:
func BenchmarkVarInt(b *testing.B) {
arr := varint.NewArray(12, 1000000) // 每个元素12位(0-4095)
b.Run("Set", func(b *testing.B) {
for i := 0; i < b.N; i++ {
arr.Set(uint(i%1000000), uint64(i%4096))
}
})
b.Run("Get", func(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = arr.Get(uint(i % 1000000))
}
})
}
这个库在需要存储大量小范围整数时特别有用,比如存储像素颜色值(0-255用8位)、游戏状态标志、压缩算法中的中间值等场景。通过精确控制位宽,可以比传统整型数组节省50-75%的内存。

