0
以下のcgoコードには、CバッファにGoの値を代入する関数と、それを取り戻す2つの代替関数があります。 getViaGoBytesおよびgetDirectC.GoBytesはCバッファを取得するために必要ですか、ここで十分なポインタですか?
getViaGoBytesはgetDirectより優れていますか?
私はそうではなく、getViaGoBytesで作成された中間スライスは不要です。
uint64変数が宣言されているときにGoが十分なメモリを割り当て、yに代入してメモリをCからGoにコピーしていますか?コメントからJimBの回答をコピーすることによって答え
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)
}
だけ63ビット、Cで 'uint64_tをN = 1 << 63により1シフトされた場合でも、int'が32である場合、' '動作しません。 'uint64_t n =(uint64_t)1 << 63;'にする必要があり、64ビットをシフトアウトすると、とにかく '0'が残ってしまいます。 Goに適用されますか、特に2番目のポイントですか? –
ありがとう@WeatherVane、私はキャストがCで必要であるか分からなかった! Goでは、1 << 64 - 1は[演算子優先順位](https://golang.org/ref/spec#Operators)に従って(1 << 64) - 1です。 [gofmt](https://blog.golang.org/go-fmt-your-code)によって強制されたレイアウトは、優先順位を暗示しようとします。 2番目の点に関しては、代入時に型に収まる限り、定数はGoで非常に大きくなる可能性があります。 [1 << 400、例えば](https://play.golang.org/p/nA_NfBJycS)。 [定数式](https://golang.org/ref/spec#Constant_expressions)も参照してください。上記のコードを実行すると、18446744073709551615が3回書き込まれます。 – Mark
GoBytesは、Cに割り当てられたバッファをGo割り当てメモリでスライスにコピーします。それがあなたが望むなら、GoBytesを使用してください。ここでもあなたはそのコピーを保持していないので、それをする理由はありません。 – JimB