Maison > développement back-end > Golang > Comment appeler une fonction C qui modifie la mémoire go ?

Comment appeler une fonction C qui modifie la mémoire go ?

WBOY
Libérer: 2024-02-05 22:36:03
avant
1205 Les gens l'ont consulté

Comment appeler une fonction C qui modifie la mémoire go ?

Contenu de la question

Supposons que j'ai une fonction C signée

// myclib.h

void modify(double* ptr, int N);
Copier après la connexion

Cela change la mémoire pointée par le pointeur de paramètre ptr.

Le code suivant est-il sécurisé avec le garbage collector de Go ? Avez-vous besoin de 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)
}
Copier après la connexion


Bonne réponse


<小时/>
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)
}
Copier après la connexion
<小时/>
[9 2 1 4 5]
modify: 9 5
modify: 42 5
[42 2 1 4 5]
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal