package main
import (
"fmt"
"unsafe"
"runtime"
)
func getPoi() unsafe.Pointer {
var a = []int{1, 2, 3}
return unsafe.Pointer(&a[0])
}
func main() {
p := getPoi()
runtime.GC()
fmt.Println("Hello, playground %v\n", *(*int)(unsafe.Pointer(uintptr(p)+8)))
}
https://play.golang.org/p/-OQl7KeL9a
juste examen des capacités des pointeurs dangereux, en essayant de minimiser je me demande si cet exemple correct ou non surcharge de la mémoire de la structure de tranche (12 octets)
. Et sinon, qu'est-ce qui ne va pas exactement après de telles actions. si ce n'est pas correct, pourquoi la valeur est toujours disponible même après un appel explicite à GC? Y a-t-il une approche pour atteindre un minimum de surcharge sur le stockage comme 'tranche de tranches', comme ce serait en C (juste un tableau de pointeurs vers des tableaux alloués, quand overhead sur chaque ligne est sizeof (int *)).
Vous devriez probablement réduire la consommation de mémoire en utilisant int32 ou même int16 plutôt que d'enregistrer 2 * 8 octets en remplaçant un en-tête de tranche par un pointeur non sécurisé. Pour le cas de tranche de coupe: Créez une découpe et faites vous-même le calcul de l'index (voir par exemple l'image du paquet). – Volker
Gardez également à l'esprit que int est de 4 octets sur les systèmes 32 bits et de 8 octets sur 64 bits, donc si vous utilisez des pointeurs, assurez-vous d'utiliser un int de taille. Aussi, si la performance des tranches est vraiment importante, utilisez Go depuis git (ou attendez 1.7), il y a eu des améliorations majeures de performance. – OneOfOne
Oui, toutes les remarques sont raisonnables, mais dans certains cas, elles ne sont pas éligibles. par exemple, si j'ai une table dynamique d'enregistrements, il ne serait pas pratique de travailler avec une tranche solide en utilisant des calculs d'index, la suppression de lignes à partir d'une tranche solide serait très lourde. dans ce cas, je pense, tranche de tranches est l'approche la plus préférable. – Exel