2016-04-08 82 views
1

cFunctionCall填充b,我可以將字符串的內容轉換爲GO字符串。但是,我認爲我的內存分配(第1行)效率不高。如何分配空的CString?

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

如果你想讓它沒有額外分配進行初始化,並從去複製,你就需要在C字符串來實現strings.Repeat功能:

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代碼量。

+0

謝謝。 malloc示例是我感興趣的。 –