Constante or not Constante

[Résolu]
Signaler
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
-
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

Messages postés
14826
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 octobre 2021
157
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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
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
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
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 !
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
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"
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
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




 






 




 
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
Si Var = Const pourquoi ne pas supprimer Var et n'utiliser que Const????

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
14826
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 octobre 2021
157
Bonjour

Pour initialiser une variable par exemple.

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
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"
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Désolé, le temps d'écrire mon message, le dialogue a continué  et manifestement tout était bien clair.

Mille excuses