kawasin73 / bitset

Bi-Endian Bit Vector (Array) in Golang
MIT License
8 stars 4 forks source link

[]byte から []uint64 への変換 #7

Closed kawasin73 closed 5 years ago

kawasin73 commented 5 years ago

[]byte から []uint64 への変換方法を調査する

kawasin73 commented 5 years ago

一つ一つの値を変換する場合はバイト列の長さに応じて変換計算コストが必要になり、また大量のメモリコピーが発生する。

ゼロコピーでこの変換を実現するには C 言語のようなキャストが必要である。 これには、reflect パッケージと unsafe パッケージを利用する

https://stackoverflow.com/questions/11924196/convert-between-slices-of-different-types

import (
    "reflect"
    "unsafe"
)

const SIZEOF_INT32 = 4 // bytes

// Get the slice header
header := *(*reflect.SliceHeader)(unsafe.Pointer(&raw))

// The length and capacity of the slice are different.
header.Len /= SIZEOF_INT32
header.Cap /= SIZEOF_INT32

// Convert slice header to an []int32
data := *(*[]int32)(unsafe.Pointer(&header))