2017-01-27 4 views
1

Il est utile que dans Tcl, "tout est une chaîne". Mais là encore, ce n'est pas exactement 100% exactement comme ça (d'où l'effet chatoyant). Ma question est la suivante: allons-nous dire que j'ai, dans une liste, les valeurs suivantes:Empreinte mémoire attendue des nombres vs alphnumerics dans Tcl

list "12" 14 2a "1a" 

Mon attente, que, si « tout est une chaîne », la mémoire allouée pour tous les 4 éléments doivent être identiques (par le comportement spec/attendu), car nous regardons 4 instances de chaînes dont la longueur est 2.
Est-ce une supposition correcte?

+1

Je devrais l'espérer, puisque les guillemets sont enlevés avant que la commande obtienne ses arguments. –

Répondre

1

Ces valeurs commenceront probablement en tant que chaînes (ce n'est pas entièrement certain que cela se produira, en raison de la possibilité de partage littéral). Examinons de près (si vous le faites vous-même, la commande tcl::unsupported::representation est en 8.6 seulement et jamais modifie l'objet en cours de regard, je mets un ;format x sur cette première ligne pour m'assurer que nous n'obtenons aucune surprise conversions).

% set value [list "12" 14 2a "1a"];format x 
x 
% tcl::unsupported::representation [lindex $value 0] 
value is a pure string with a refcount of 2, object pointer at 0x100874070, string representation "12" 
% tcl::unsupported::representation [lindex $value 1] 
value is a pure string with a refcount of 2, object pointer at 0x1008741c0, string representation "14" 
% tcl::unsupported::representation [lindex $value 2] 
value is a pure string with a refcount of 2, object pointer at 0x100874c40, string representation "2a" 
% tcl::unsupported::representation [lindex $value 3] 
value is a pure string with a refcount of 2, object pointer at 0x1008743d0, string representation "1a" 
% tcl::unsupported::representation $value 
value is a list with a refcount of 4, object pointer at 0x100874910, internal representation 0x1008eb050:0x0, string representation "12 14 2a 1a" 

Alors oui, ces valeurs sont à peu près les mêmes. Il n'y a aucune représentation interne de l'un d'entre eux, et la représentation de chaîne que chacun utilise est un tampon qui a été alloué pour être long de 3 octets (un pour chaque caractère, et un pour un octet NUL final). Cependant, la liste elle-même a une représentation sous forme de chaîne (ainsi que sa liste interne) même si on ne lui en demande pas; C'est parce que vous utilisez une liste de littéraux et le compilateur de Tcl optimise cela à un seul littéral car c'est habituellement la bonne chose à faire.

+1

Une fois la valeur numérique demandée, la représentation interne sera également présente. Pour les "petits" entiers, ils sont stockés directement dans la structure Tcl_Obj et n'entraînent donc aucun coût de stockage supplémentaire. –