
假设我有一个带签名的 C 函数
// myclib.h void modify(double* ptr, int N);
这会改变参数指针 ptr 指向的内存。
以下代码对于 Go 的垃圾收集器来说是否安全?是否需要 runtimer.Pinner?
package main
// #cgo CFLAGS: -g -Wall
// #include "myclib.h"
import "C"
import (
"fmt"
"runtime"
)
func modifyWrapper(v []float64) {
ptr := (*C.double)(&v[0])
N := (C.int)(len(v))
pinner := runtime.Pinner{}
pinner.Pin(ptr)
C.modify(ptr, N)
pinner.Unpin()
}
func main() {
v := []float64{9.0, 2.0, 1.0, 4.0, 5.0}
modifyWrapper(v)
}
package main
/*
#cgo CFLAGS: -g -Wall
#include <stdio.h>
void modify(double* ptr, int N) {
if (!ptr || N <= 0) {
return;
}
printf("modify: %g %d\n", *ptr, N);
*ptr = 42;
printf("modify: %g %d\n", *ptr, N);
}
*/
import "C"
import (
"fmt"
"unsafe"
)
func modify(v []float64) {
ptr := (*C.double)(unsafe.SliceData(v))
N := (C.int)(len(v))
C.modify(ptr, N)
}
func main() {
v := []float64{9.0, 2.0, 1.0, 4.0, 5.0}
fmt.Println(v)
modify(v)
fmt.Println(v)
}[9 2 1 4 5] modify: 9 5 modify: 42 5 [42 2 1 4 5]
以上就是如何调用修改go内存的C函数?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号