亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何分配空的CString?

如何分配空的CString?

Go
慕田峪7331174 2022-01-04 10:17:16
cFunctionCall 填充 b 并且我能夠將字符串的內容轉換為 GO 字符串。但是,我認為我的內存分配(第 1 行)效率不高。b := C.CString(strings.Repeat(" ", 50))defer C.free(unsafe.Pointer(b))C.cFunctionCall(b, 50)rs := C.GoString(b)log.Printf("rs: '%v'\n", rs)
查看完整描述

1 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

如果您希望在沒有額外分配和從 Go 復制的情況下對其進行初始化,則需要strings.Repeat通過 C 字符串實現該函數:


func emptyString(size int) *C.char {

    p := C.malloc(C.size_t(size + 1))


    pp := (*[1 << 30]byte)(p)

    bp := copy(pp[:], " ")

    for bp < size {

        copy(pp[bp:], pp[:bp])

        bp *= 2

    }

    pp[size] = 0

    return (*C.char)(p)

}

如果不需要初始化,您可以自己簡單地 malloc/calloc 指針并將其傳遞給您的函數。


b := C.malloc(50) // or 51 if the depending on what size your function is expecting

defer C.free(unsafe.Pointer(b))

C.cFunctionCall((*C.char)(b), 50)

除非它被多次調用并實際上造成性能問題,否則請使用您已有的并減少您必須處理的 C 代碼量。


查看完整回答
反對 回復 2022-01-04
  • 1 回答
  • 0 關注
  • 193 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號