我有一個(gè)變量(但組合大小有上限)需要傳遞給C的GoStrings數(shù)量,我想盡可能便宜地做到這一點(diǎn)。我將多次執(zhí)行此操作(因此可以考慮將重用的預(yù)分配緩沖區(qū)視為零成本)。我最初的方法是循環(huán)遍歷 GoStrings,將每個(gè) GoString 轉(zhuǎn)換為 CString 并將其推送到 C。for _, str := range mystrings { cstr := C.CString(str) defer C.free(unsafe.Pointer(cstr)) C.push_str(pushStrFn, cstr)}當(dāng)然,由于 以及 N 個(gè) CGo 調(diào)用,這正在執(zhí)行 N 堆分配 - 所有這些都不便宜。C.CString接下來是使用在開始時(shí)分配的時(shí)間在Go中構(gòu)建一個(gè)大字符串,然后在單個(gè)CGo調(diào)用中將其傳遞給C,并帶有一些長(zhǎng)度信息。這是一個(gè) CString 調(diào)用和一個(gè) CGo 調(diào)用 - 這是一個(gè)實(shí)質(zhì)性的改進(jìn)。strings.Builderbuilder.Reset()for _, str := range mystrings { builder.WriteString(str)}C.push_strs(pushStrsFn, C.CString(builder.String()))但是這種方法仍在執(zhí)行不必要的復(fù)制!理想情況下,我想預(yù)先分配一大塊內(nèi)存,我可以將其傳遞給C,然后只需將字符串直接復(fù)制到C中,而無需使用大型GoString中介。我能夠提前預(yù)先分配一個(gè)大數(shù)組,并迭代GoStrings中的字符,一次復(fù)制一個(gè)。這避免了中間復(fù)制,但比專用的字符串復(fù)制函數(shù)(如構(gòu)建器的函數(shù))慢得多。cCharArray := C.malloc(C.size_t(MAX_SIZE) * C.size_t(unsafe.Sizeof(uintptr(0))))goCharArray := (*[1<<30 - 1]C.char)(cCharArray)for _, str := range mystrings { for i, c := range str { goCharArray[offset+i] = C.char(c) }}C.push_charArray(pushCharArrayFn, (*C.char)(cCharArray))有沒有一種更快的方法來做到這一點(diǎn),我錯(cuò)過了?我是否可以以某種方式將 C 緩沖區(qū)饋送到 ,或者使用字符串復(fù)制函數(shù)直接提供給 C 緩沖區(qū)?strings.Builder
有沒有辦法直接將gorang字符串復(fù)制到預(yù)分配的C字符緩沖區(qū)
長(zhǎng)風(fēng)秋雁
2022-10-04 17:18:46