2016-05-04 1 views
1
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))) 
} 

sortie: 3Est-il sûr de ne garder que le danger? Pointeur sur le premier élément de la tranche et aucun refs à cette tranche elle-même?

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 *)).

+0

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

+0

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

+0

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

Répondre

0

Il est possible que, par coïncidence, cela fonctionnera pour vous mais je le considérerais comme dangereux et non supporté. Le problème est que, si la tranche dépasse sa capacité et doit être réaffectée, qu'advient-il de votre pointeur? Vraiment si vous voulez optimiser les performances, vous devriez utiliser un tableau. En plus de sa performance étant intrinsèquement meilleure et son empreinte mémoire étant plus petite, cette opération serait toujours en sécurité. En outre, de manière générale, je vois des gens faire toutes sortes de choses stupides pour essayer d'améliorer les performances quand leur conception est intrinsèquement pauvre (comme utiliser des tableaux dynamiques ou des listes chaînées sans raison). Si vous avez besoin de la croissance dynamique d'une tranche alors un tableau n'est pas vraiment une option (et l'utilisation de ce pointeur est probablement très dangereuse) mais dans de nombreux cas, les développeurs ne parviennent pas à dimensionner leur collection de façon appropriée. Je suppose que votre exemple est artificiel, mais dans un tel scénario, vous n'avez aucune raison d'utiliser une tranche car la taille de votre collection est connue au moment de la compilation. Même si ce n'était pas le cas, il arrive souvent que la taille soit déterminée avant l'allocation et que les gens ne parviennent pas à le faire pour faciliter l'utilisation de collections abstraites de taille dynamique.

+0

btw, je pense, array est une bonne option, parce que si comparé à un certain type de listes (permettant une croissance facile sans Reallocs), il donne la meilleure utilisation de la mémoire et les performances de numérisation. Je pense, c'est une question très spécifique, quel type de collection à utiliser, en fonction des conditions spécifiques. – Exel

+0

aussi, cet exemple ne sera jamais la base d'une solution réelle, bien sûr.J'essaie de tels cas extrêmes pour mieux comprendre le comportement et les relations linguistiques – Exel