2016-11-20 5 views
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) 
} 
+1

だけ63ビット、Cで 'uint64_tをN = 1 << 63により1シフトされた場合でも、int'が32である場合、' '動作しません。 'uint64_t n =(uint64_t)1 << 63;'にする必要があり、64ビットをシフトアウトすると、とにかく '0'が残ってしまいます。 Goに適用されますか、特に2番目のポイントですか? –

+0

ありがとう@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

+1

GoBytesは、Cに割り当てられたバッファをGo割り当てメモリでスライスにコピーします。それがあなたが望むなら、GoBytesを使用してください。ここでもあなたはそのコピーを保持していないので、それをする理由はありません。 – JimB

答えて

0

マーキング質問:ゴー機能付きスライスに

GoBytesコピーCに割り当てられたバッファは メモリを割り当てられました。それがあなたが望むなら、GoBytesを使用してください。ここであなたは でもそのコピーを保持していないので、それを行う理由はありません。

また、ベンチマークは興味深い:

$ go test -bench . -benchmem 
BenchmarkGoBytes-8  20000000   97.8 ns/op  32 B/op   3 allocs/op 
BenchmarkDirect-8  2000000000   0.84 ns/op  0 B/op   0 allocs/op 
PASS 
関連する問題