IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Variable globale ou passage de variable ?


Sujet :

Langage Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Variable globale ou passage de variable ?
    Bonjour

    Une question qui paraitra peut etre idiote mais que je ne me suis jamais posé jusqu'à present...

    J aimerai savoir selon vous ce qui est le plus leger niveau conso memoire .
    J ai un tableau de 1000 enregistrements que je passe de foncton en fonction..

    Ne serait il pas plus judicieux de mettre ce tableau en variable globale ?

    Je sais que l espace memoire est reservé à la creation de la variable globale mais à moins de ne pas utiliser le tableau je ne vois pas la diff que cela peut faire....

    Merci de vos lumieres ...
    Dernière modification par Roland Chastain ; 13/06/2014 à 20h48. Motif: Correction du titre

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Par défaut le passage est par valeur et cela a une incidence sur la mémoire.
    Le plus propre dans ton cas est d'utiliser le passage par référence (mot clé var).

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour le tuyau, je ne connais pas.
    J ai donc cherché et ai trouvé ça
    http://www.developpez.net/forums/d74...e/#post4308969

    Il y a deux méthodes pour travailler sur des paramètres d'entrés d'une fonction, sur des types de données simples (integer, réel, string, etc):

    1) Passage par valeur

    La valeur de l'expression passée en paramètre est copiée dans une variable locale. C'est cette variable qui est utilisée pour faire les calculs dans la fonction appelée.
    Si l'expression passée en paramètre est une variable, son contenu est copié dans la variable locale. Aucune modification de la variable locale dans la fonction appelée ne modifie la variable passée en paramètre, parce que ces modifications ne s'appliquent qu'à une copie de cette dernière.

    2) Passage par variable

    La deuxième méthodes consiste à passer non plus la valeur des variables comme paramètre, mais à passer les variables elles-mêmes. Il n'y a donc plus de copie, plus de variable locale. Toute modification du paramètre dans la fonction appelée entraîne la modification de la variable passée en paramètre.
    De ce que je comprends, je devrai utiliser le passage par variable quand je fais des operations sur mon tableau (modif des valeurs) et en var quand je fais des operations à l'aide de mon tableau.

    Mais dans le cas du var, si le contenu est copié dans une varibale locale, ça prend le double de memoire non ?

  4. #4
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Tu t'emmêles un peu les pinceaux...

    Si tu veux, dans une fonction, modifier les valeurs de ton tableau, c'est bien un passage par variable qu'il faut faire, mais c'est dans ce cas qu'il faut utiliser var !!!
    En utilisant var : tu ne fais que donner l'adresse de ta variable (comme un pointeur), il n'y a pas de copie de la variable.

    Thierry

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci.
    C est clair.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 764
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Quelques précisions tout de même

    Dans le cas de la lecture seule, le paramètre devrait être défini en const.
    Const est également un passage par valeur mais apporte quelques optimisations pour les chaînes et les tableaux. En terme d'utilisation mémoire, c'est avec les tableaux que const est le plus efficace, en terme de vitesse, c'est avec les chaînes qu'il trouve tout son sens.

    Chaîne ou tableau, on ne passe en fait qu'un pointeur. Le comportement diffère cependant.

    Par valeur (défaut) :
    la donnée d'un tableau est copiée en local, l'allocation va donc doubler dans tous les cas.
    La chaîne est aussi "copiée" mais la copie d'une chaîne n'est que l'incrémentation de son compteur d'utilisation. L'allocation ne change pas tant que la chaîne n'est pas modifiée. Par contre la gestion du compteur est assez gourmande en temps.
    Dans les deux cas, la donnée originale n'est pas modifiée. Cela revient à définir et initialiser une variable locale.

    Par adresse (var) :
    Chaîne ou tableau, on accède directement en lecture/écriture à la donnée originale, pas d'allocation supplémentaire mais la gestion du compteur reste pour les chaînes.

    Par valeur (const) :
    Const est également un passage pas valeur mais puisque la donnée n'est pas modifiable :
    il n'y a pas copie du tableau (!), on accède directement à la donnée originale comme par adresse (var) mais elle ne peut être modifiée.
    Même chose pour une chaîne mais en plus, la gestion du compteur est totalement ignorée (pas d'incrémentation possible puisque non modifiable). Beaucoup plus rapide dans des procédures imbriquées.

    En résumé :
    lecture seule : const ;
    donnée originale à modifier : var ;
    utilisable comme une variable locale : défaut.

    Ceci est une optimisation pour les chaînes et tableaux. Ça ne vaut pas forcément pour les autres types

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/12/2018, 18h53
  2. Réponses: 10
    Dernier message: 10/04/2014, 21h01
  3. Réponses: 7
    Dernier message: 03/11/2011, 09h29
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo