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

C++ Discussion :

Comment considérer les références ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Par défaut Comment considérer les références ?
    Bonjour, je me posais la question comment considérer les références côté compilation et à l'exécution ?

    Une référence c'est comme l'objet lui-même, lorsqu'on utilise une variable en écrivant le nom de la variable dans le code source, on utilise ce qu'elle contient, bref c'est sa référence. Mais c'est quand même un emplacement mémoire.

    Et les pointeurs ne sont que des variables qui ont comme contenu une adresse mémoire. Le déférencement, le nom le dit c'est accéder à l'objet pointé en ayant sa référence, donc son adresse.

    Est-ce que je peux considérer que en écrivant *pointeur que le compilateur remplace à la compilation ce texte par un indice qui à l'exécution sera remplacé par une adresse mémoire relative à l'emplacement du début du programme en mémoire ?

    Mais dans ce cas quelle est la différence réelle entre la mémoire statique et dynamique ? Puisque le compilateur ne peut pas réserver une place mémoire d'avance avant l'exécution même du programme, donc c'est quand même de la mémoire alloué dynamiquement à l'exécution.

    Tandis que avec le new il alloue tout de même dynamiquement alors ou est la différence en fait ?

    En théorie si le compilateur supporterait cela, au lieu d'écrire le nom d'une variable dans le code on pourrait écrire une adresse mémoire = 5, du genre: 0x4F5474 = 5 ? Ce qui est tout à fait inconcevable puisqu'on ne sait pas ce qu'il y a cette adresse, mais je parles d'un point de vue purement théorique.

    Je cherches à comprendre le fondement de tout programme exécuté sous windows, ce qui se passe vraiment en fait.

  2. #2
    Membre éprouvé Avatar de galak63
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut
    un tout petit morceau de réponse : passer des paramètres a une fonction par référence permet d'éviter la recopie de la variable

  3. #3
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Une référence c'est comme l'objet lui-même, lorsqu'on utilise une variable en écrivant le nom de la variable dans le code source, on utilise ce qu'elle contient, bref c'est sa référence. Mais c'est quand même un emplacement mémoire.
    En C++, une référence est un alias pour un nom de variable.

    Mais dans ce cas quelle est la différence réelle entre la mémoire statique et dynamique ? Puisque le compilateur ne peut pas réserver une place mémoire d'avance avant l'exécution même du programme, donc c'est quand même de la mémoire alloué dynamiquement à l'exécution.
    Je vais pas te faire un cours de système. Pour ça je pense que google t'aidera fort bien. Disons jusque qu'un processus a une mémoire propre (virtuelle) d'une certaine taille, divisée en plusieurs zones. L'une de ces zones s'appelle le tas, c'est dans cette zone que new alloue dynamiquement des emplacements. Une des zones est une zone de données statiques (contenant les constantes notamment) dont les adresses sont fixées (lorsque le processus est chargé en mémoire, les données sont chargées à un endroit bien précis).

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Mais c'est quand même un emplacement mémoire.
    C'est là toute la différence. Une référence n'est pas un emplacement mémoire. Une référence n'a pas d'adresse propre par exemple.
    Une référence c'est exactement la même chose que l'objet référencé.

    Mais dans ce cas quelle est la différence réelle entre la mémoire statique et dynamique ? Puisque le compilateur ne peut pas réserver une place mémoire d'avance avant l'exécution même du programme, donc c'est quand même de la mémoire alloué dynamiquement à l'exécution.
    Pour mieux comprendre cela il faudrait que tu comprennes comment l'allocation dynamique, la mémoire statique et la pile fonctionnent.
    Le plus simple pour ça est d'avoir un petit cours d'assembleur ou truc du style.

    En théorie si le compilateur supporterait cela, au lieu d'écrire le nom d'une variable dans le code on pourrait écrire une adresse mémoire = 5, du genre: 0x4F5474 = 5 ? Ce qui est tout à fait inconcevable puisqu'on ne sait pas ce qu'il y a cette adresse, mais je parles d'un point de vue purement théorique.
    Les variables globales sont ce genre de choses.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si j'ai bien lu ton post, il contient deux questions qu'on peut séparer :
    1. Quelle est la différence entre allocation statique et dynamique ?
    2. Quelle est la différence entre pointeur, référence, et... normal ?

    Mes réponses:
    1. Le problème, c'est qu'il n'y a pas deux types de mémoire, mais trois (quatre si on compte aussi le code) : Mémoires statique, dynamique et automatique.
      • La mémoire statique, ce sont les variables globales, les variables de classe static et les variables locales static. Ces emplacements sont déterminés à la compilation et alloués dès le chargement du programme.
      • La mémoire dynamique, c'est le tas, bref les données pointées par le retour d'un malloc(). On n'a jamais directement de variables en mémoire dynamique: Seulement des pointeurs vers cette mémoire, pointeurs qui peuvent être en mémoire statique ou automatique.
      • La mémoire automatique, c'est la pile. C'est là que se trouvent toutes les variables locales (non-static), donc les objets dont le destructeur est automatiquement appelé quand on quitte le bloc : Les variables sont empilées lors de leur création, et dépilées lors de leur destruction.
    2. Pour références et pointeurs, c'est moins clair. Ce qui est certain, c'est qu'un pointeur est plus clairement défini qu'une référence.
      • Un pointeur, c'est une variable contenant une adresse mémoire. Point.
      • Une référence, c'est plus un pointeur caché non-modifiable. La référence peut être une variable en mémoire, comme tout pointeur (notamment, pour une référence transmise en paramètre) et peut même être invalide (voire nulle) si on joue trop avec les pointeurs. Simeplement, la référence ne peut être qu'initialisée, et passée sa création, toute opération sur la référence est transformée en opération sur la variable pointée.
        Une autre différence avec les pointeurs, c'est qu'un pointeur peut pointer vers le premier élément d'un tableau et être utilisé pour accéder aux éléments suivants. Une référence ne supporte aucune arithmétique, et pointe forcément sur un et un seul élément (qui peut être le premier d'un tableau, mais les autres ne seront pas accessibles à moins de truander avec des pointeurs). Grâce à cela, une référence est peut-être plus facilement optimisée lors de l'utilisation de fonctions inline, et peut alors à ce moment être considérée par le compilo comme un simple alias...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [Webservices/Exchange] Comment rendre les références dynamiques ?
    Par john-thiriet dans le forum Framework .NET
    Réponses: 2
    Dernier message: 02/10/2008, 15h05
  2. Comment gérer les références?
    Par faruedde dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/09/2008, 17h24
  3. Réponses: 0
    Dernier message: 23/02/2008, 13h42
  4. [DX10][VC++2005]Comment ajouter les références?
    Par cladsam dans le forum Visual C++
    Réponses: 20
    Dernier message: 30/12/2006, 16h31
  5. [VB]Comment supprimer les références ?
    Par AsmCode dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/03/2006, 21h54

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