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 :

[const]Différence comportement C/C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingénieur consultant
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur consultant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par défaut [const]Différence comportement C/C++
    Quelqu'un arrive-t-il à expliquer le comportement ce code un fois compilé (avec g++) puis exécuter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    int main()
    {
    	const int a = 2;
    	int * pa;
    	const int * cpa;
     
    	cpa = &a;
    	pa = (int*)cpa; //Pour gruger le mot clé const
    	*pa = 4;
     
    	printf("a = %d\n", a);
    	printf("*pa = %d\n", *pa);
     
    	return 0;
    }
    On a alors la sortie suivante :

    a = 2
    *pa = 4

    Pourquoi n'a-t-on pas :

    a = 4
    *pa = 4

    pa est censé pointé le contenu de a ?
    c'est d'ailleurs le résultat obtenu avec gcc...

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Tu veus encore plus étonnant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const int ca = 0;
    int& ra = const_cast<int&>(ca);
    ++ra;
    std::cout << ra << ca;
    std::cout << &ra << &ca;
    Les objets sont à la même adresse mais n'ont pas la même valeur !
    Je suis pas certain (pas réussi à vérifier dans la norme), mais je crois que quand tu définis une variable constante sur un type fondamentale alors la valeur est imuable quoique tu fasses. (comment je sais pas, soit il remplace de manière litéral mais j'en doute, soit il stoocke la variable dans une table innaccesible et l'utilise dès qu'il voit la variable nue, ie ca).

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Salut

    Si tu regardes le code assemblé (avec visual studio) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	printf("a = %d\n", a);
    004113DA  mov         esi,esp 
    004113DC  push        2    
    004113DE  push        offset string "a = %d\n" (41580Ch)
    Là ou a est utilisé, le compilo met directement en dur la valeur que tu lui a donné à son initialisation. C'est très bien d'ailleurs, car c'est mal de vouloir gruger const

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    C'est pas un comportement indéfini de vouloir modifier la valeur d'une constante manifeste ?

  5. #5
    Membre confirmé
    Profil pro
    Ingénieur consultant
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur consultant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par défaut
    Je ne pense pas que cela soit en rapport avec la norme, mais plutôt dû à des optimisations de compilateur.

    Si je compile avec gcc sans optimisation (-O0 ou rien) j'ai le résultat attendu :

    4
    4

    si j'utilise gcc avec optimisation (-O1,2,3...) j'ai la même chose qu'avec g++ :

    2
    4

    Par contre ce qui me dérange avec g++ c'est que sans options d'optimisation (-O0 ou rien par défault) on devrait avoir :

    4
    4

    or ce n'est pas le cas, que l'on utilise -O0,1,2,3... ou rien on a toujours le même résultat

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par jldgbu Voir le message
    Je ne pense pas que cela soit en rapport avec la norme, mais plutôt dû à des optimisations de compilateur.
    Si ça a à voir car à partir du moment ou tu es dans un comportement indéfini, le compilateur a le droit de faire ce qui lui plaît, il ne te doit strictement rien. Donc ça varie d'un compilo à un autre, c'est logique et ça ne devrais pas te poser de souci car dans un code propre, on ne modifie pas des const .

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    T'as joué au plus malin avec le compilateur et t'as perdu.

Discussions similaires

  1. Différence comportement Cassini/IIS
    Par Laotzu dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/01/2011, 10h17
  2. [EasyPHP] Différence comportement démarrage Apache par EasyPHP ou par ligne de commande
    Par SONY30 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 19/10/2010, 11h48
  3. Différence comportement entre product et RCP
    Par DaveShot dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 16/03/2010, 09h03
  4. [swing]Différence de comportement selon hardware
    Par xxaragornxx dans le forum Composants
    Réponses: 13
    Dernier message: 16/11/2005, 17h51
  5. [JFrame] Explication sur une différence de comportement
    Par jems dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 06/07/2005, 09h23

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