下面的cgo代码有一个将Go值放入C缓冲区的函数,以及两个获取它的替代函数;getViaGoBytes和getDirect。
getViaGoBytes比getDirect更好吗?
我认为不是,而在getViaGoBytes中创建的中介切片是不必要的。
我是否正确地认为当声明uint64 y变量并将其赋值时,Go会分配足够的内存,并且将内存从C复制到Go中?
getViaGoBytes比getDirect更好吗?
我认为不是,而在getViaGoBytes中创建的中介切片是不必要的。
我是否正确地认为当声明uint64 y变量并将其赋值时,Go会分配足够的内存,并且将内存从C复制到Go中?
package main
/*
char buf[8];
void put(char * input, int size) {
while (size--) {
buf[size] = input[size];
}
}
*/
import "C"
import "unsafe"
func put(input uint64) {
C.put((*C.char)(unsafe.Pointer(&input)), C.int(unsafe.Sizeof(input)))
}
func getViaGoBytes() uint64 {
var out uint64
data := C.GoBytes(unsafe.Pointer(&(C.buf[0])), C.int(unsafe.Sizeof(out)))
out = *(*uint64)(unsafe.Pointer(&data[0]))
return out
}
func getDirect() uint64 {
return *(*uint64)(unsafe.Pointer(&(C.buf[0])))
}
func main() {
var input uint64 = 1<<64 - 1
println(input)
put(input)
var x uint64 = getViaGoBytes()
println(x)
var y uint64 = getDirect()
println(y)
}
uint64_t n = 1<<63;
将无法工作,需要使用uint64_t n = (uint64_t)1<<63;
。其次,向左移动64位将使您最终得到0。这是否适用于Go语言,特别是第二点? - Weather Vane