Maison >développement back-end >Golang >Comment créer efficacement des tranches ou des tableaux Go à partir d'unsafe.Pointer ?

Comment créer efficacement des tranches ou des tableaux Go à partir d'unsafe.Pointer ?

DDD
DDDoriginal
2024-12-06 05:04:13447parcourir

How to Efficiently Create Go Slices or Arrays from unsafe.Pointer?

Création de tranches ou de tableaux à partir d'un pointeur non sécurisé dans Golang : une alternative efficace

Les pointeurs vers des tableaux peuvent être représentés sous forme de valeurs uintptr dans Golang. Cependant, accéder au tableau d'origine peut être difficile lorsque le pointeur est stocké en tant que uintptr.

Méthode inefficace : copie de mémoire

Une approche naïve consiste à copier les données de le pointeur dans une nouvelle tranche :

data := make([]byte, size)
stepSize := unsafe.Sizeof(data[0])
for i := 0; i < size; i++ {
    data[i] = *(*byte)(unsafe.Pointer(p))
    p += stepSize
}

Cette méthode est inefficace car elle implique la copie de données, ce qui peut prendre du temps pour les grandes tableaux.

Méthode efficace : Reflect.SliceHeader

Une approche plus efficace consiste à utiliser Reflect.SliceHeader pour créer une tranche ou un tableau sans copier la mémoire :

var data []byte

sh := (*reflect.SliceHeader)(unsafe.Pointer(&data))
sh.Data = p
sh.Len = size
sh.Cap = size

fmt.Println(data)

Cette méthode convertit le uintptr en reflet.SliceHeader et modifie ses champs pour pointer vers l'existant. tableau. La tranche ou le tableau résultant partagera la même mémoire sous-jacente que le tableau d'origine.

Méthode alternative : littéral composite

Une autre alternative consiste à utiliser un littéral composite pour créer un Reflect.SliceHeader :

sh := &reflect.SliceHeader{
    Data: p,
    Len:  size,
    Cap:  size,
}

data := *(*[]byte)(unsafe.Pointer(sh))

fmt.Println(data)

Cette approche produit le même résultat que la précédente méthode.

Précautions

Lors de l'utilisation de pointeurs uintptr, il est important de s'assurer que le tableau d'origine reste valide pendant toute la durée de vie du pointeur. De plus, les emballages dangereux doivent être utilisés avec prudence en raison de leur impact potentiel sur la sécurité du type.

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!

Déclaration:
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