Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
26 févr. 2008 à 11:43
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 2016
-
26 févr. 2008 à 16:05
Bonjour
Je me pose une question (peut être bête) en ce moment.
Le but est d'utiliser le moins de mémoire possible. Si j'utilise une constante dans mon programme (Exemple : {Private Const C_Toto = "TOTO"})
Et que dans mon code je fait :
Dim Machin as string
Dim Truc as string
Machin = C_Toto
Truc = C_Toto
On est d'acore (à moins qu'il ne faille que je revoie mes cours de prog) que au moment de la compilation mon code vas être transformé en :
Dim Machin as string
Dim Truc as string
Machin = 'TOTO"
Truc = "TOTO"
Donc deux chaine de carac bien distincte n'ayant pas la même adresse mémoire. Donc ma constante utiliseras deux fois 4 oct de mémoire (on oublie pour le moment les problématique de marque de fin de chaine et autre truc du genre). Si j'avais fait ça :
Dim Machin as string
Dim Truc as string
Machin = C_Toto
Truc = Machin
Alors ma constante n'apparais qu'une fois et n'utiliseras donc qu'une seul fois de la mémoire.
Cela me mène à la conclusion suivante : Les constante c'est pratique mais pas forcément économe en mémoire (surtout que jusqu'à maintenant faire apparaitre 30/40 fois, voir parfois plus, une constante dans mes programme ne me dérangeais pas le moins du monde). Il vaudrais peut être mieux que je déclare des variables initialisées à la valeur de ma constate et que j'utilise comme si elle été une constante (alors ce sera toujours la même adresse mémoire que je pointerais).
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 26 févr. 2008 à 13:45
Pour en revenir au sujet, pour ce code
Dim Machin as string
Dim Truc as string
Machin = 'TOTO"
Truc = "TOTO"
le compilateur va générer autant de chaines que tu as d'exemplaires dans le code
Par contre pour celui-ci,
Dim Machin as string
Dim Truc as string
Machin = C_Toto
Truc = C_Toto
le compilateur ne devrait générer qu'une seule fois la chaine
Ensuite dans tous les cas, à l'utilisation, une zone mémoire sera créée par variable dans laquelle sera recopier la chaine correspondante. Et à ça te ne peut rien y faire.
Dans tous les cas, c'est la solution avec constante qui consommera le moinsde mémoire, pour ce qui est de la mémoire utilisée pour chargée le code. Par contre la mémoire utilisée pour executer le code (ici la pile) sera à priori identique.
Kristof_Koder
Messages postés918Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention27 octobre 200810 26 févr. 2008 à 15:36
Danss le cas d'utilisation d'une constante, comme dans ce code :
Private Const C_Toto = "TOTO"
Dim Machin as string
Dim Truc as string
Machin = C_Toto
Truc = C_Toto
Rien n'indique que le compilo VB utilisera deux emplacements mémoire pour initialiser les deux variables ! de nos jours, les compilo sont de plus en plus intelligent ! Qui plus est, cela se joue au niveau du compilateur, qui lui est en mesure de gérer l'affaire en ne stockant la valeur "TOTO" qu'une fois. Dans le cas ou c'est un précompilateur, comme en C, qui bosse sur l'affaire, la oui, il y aura duplication de la chaine, car le précompilateur travaille sur le code source et retourne un autre code source, mais le compilateur travaille sur le code source et retourne un code exécutable.
En fait, je dirais qu'il faudrait se tourner vers les concepteurs du compilateur VB pour savoirexactment ce à quoi on aboutit !
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 26 févr. 2008 à 15:58
Ok donc une constante (à priori) n'est qu'une fois en mémoire et sont adresse est copiée à la place de la référence (si c'est le compilo qui s'occupe de ça et non pas le pré-compilo).
Donc à ma question "Constante or not Constante" je répondrais "Constante"
Merci à tous pour le temps accordé à mon interrogations
Amicalement
Pensez "Réponse acceptée"
Vous n’avez pas trouvé la réponse que vous recherchez ?
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 26 févr. 2008 à 15:58
Casy a raison mais je crains qu'il n'ait pas été totalement compris en parlant de "recopie".
En Basic et tous ses avatars, une variable chaîne ne contient jamais une chaîne mais bien l’adresse d’une chaîne et sa longueur, autrement dit c’est un pointeur
Si la chaîne est une constante ce pointeur est fixe et pointe toujours sur l’emplacement de mémoire où a été rangée, au chargement, la valeur déclarée.
Donc toutes les chaînes variables qui doivent être initialisées à la valeur d’une constante contiendront le même pointeur.
Dès qu’une chaîne est modifiée, le résultat est rangé dans le tas et la chaîne pointe ensuite sur cette adresse.
On ne peut donc pas strictement parler de recopie.
En résumé, soit:
a="truc"
b=a
Il n'existe qu'une chaîne "truc" et donc pas de création de zone mémoire.
Mais si on fait:
b=a+"Machin"la chaîne "trucMachin" est créée et son adresse est rangée dans b <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Enfin si on fait
a= "truc"
b="truc"
il n’est pas exclu que le compilateur optimise le code créé, comme cela est fait dans d’autres langages.et remplace b="truc" par b=a
On pourrait le vérifier en comparant la taille des exe produits
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 26 févr. 2008 à 14:18
Merci pour l'astuce NHenry (je pensais que VB détectait le type de la constante à la pré-compilation et modifiais en fonction de ce dit type)
<hr size="2" width="100%" />Ok donc si je comprend bien pour toi (casy) dans le code :
Dim Machin as string
Dim Truc as string
Machin = C_Toto
Truc = C_Toto
L'adresse mémoire de ma constante sera le même dans les deux cas (donc pas d'utilisation excessive de la mémoire), en réalité un pointeur vers ma chaine sera insérer à la place de la constante et non pas une chaine de carac (et donc je pointe bien vers la même zone mémoire) ?
J'es bien compris que pour chaque variable une zone mémoire est crée (quand même ça je l'es compris) ma question est uniquement basé sur les constantes.