Constante or not Constante

Résolu
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 26 févr. 2008 à 11:43
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 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).

Ma question :
Je raconte n'importe quoi ou non ?

Amicalement
Pensez "Réponse acceptée"

9 réponses

NHenry Messages postés 15069 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 29 mai 2023 158
26 févr. 2008 à 12:00
Bonjour

Une astuce en VB, pour éviter quelques prise en mémoire, précise le type :

Private Const MaConst as String="TOTO"

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
3
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
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 !
3
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
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"
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
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 

Amicalement




 






 




 
3
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 59
26 févr. 2008 à 12:33
Salut,
Si Var = Const pourquoi ne pas supprimer Var et n'utiliser que Const????

@+: Ju£i?n
Pensez: Réponse acceptée
0
NHenry Messages postés 15069 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 29 mai 2023 158
26 févr. 2008 à 12:53
Bonjour

Pour initialiser une variable par exemple.

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
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.

Amicalement
Pensez "Réponse acceptée"
0
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
26 févr. 2008 à 16:05
Désolé, le temps d'écrire mon message, le dialogue a continué  et manifestement tout était bien clair.

Mille excuses 
0