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 :

Détection d'une architecture 64-bits


Sujet :

C++

  1. #1
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut Détection d'une architecture 64-bits
    Bonjour !

    Pour les besoins d'un projet, j'aimerai savoir comment je peux arriver à détecter si mon programme tourne sur une architecture 64-bits grâce à des flags préprocesseurs. Merci d'avance pour votre aide


    Nico.
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Sous gcc, on a __WORDIZE qui vaut 32 ou 64. Sous VC++, tu dois pouvoir te débrouiller avec la macro _WIN64. Pour les autres compilateurs, je ne sais pas, il n'y a rien de standard, à moins de jouer avec sizeof(void*).

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Un bon point de départ : http://predef.sourceforge.net (section "Architectures").

  4. #4
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Merci pour le site mais je l'avais déjà visité hier (un site très utile au passage). Je ne suis pas sûr que ce soit suffisant de faire un truc de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #if defined(__amd_64__) || defined(__ia64__)
            // alors on a affaire à un processeur 64 bits
    En effet, je pense qu'il doit exister des processeurs powerpc ou mips en version 64 bits pour lesquels il n'existe apparement pas de flags (d'après le site). Et si c'était le cas, je devrai être obligé de trouver tous les flags des processeurs existants
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par nicolas66
    Et si c'était le cas, je devrai être obligé de trouver tous les flags des processeurs existants
    Je pense que c'est plutôt une question de SDK que de processeur. C'est donc AMHA plutôt dans les docs des SDK qu'il faut fouiner.

    De toute façon, lorsqu'on développe un projet portable on cherche généralement à savoir par quoi on est compilé (au niveau préprocesseur) de façon à éviter certains problèmes d'incompatibilité entre compilateurs, ou exploiter des spécificités.

    La démarche pour le 32/64 bits est (ou devrait en tout cas) être la même...
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  6. #6
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par rigobert
    Je pense que c'est plutôt une question de SDK que de processeur. C'est donc AMHA plutôt dans les docs des SDK qu'il faut fouiner.
    Qu'est-ce que AMHA ?
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par nicolas66
    Qu'est-ce que AMHA ?
    A Mon Humble Avis, traduction française de IMHO .
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  8. #8
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Ok pardon pour mon manque de culture rigobert . Pour revenir à mon problème, je n'ai pas vraiment compris pourquoi tu parlais de SDK.

    Je précise que je souhaite détecter les architectures 64 bits pour pouvoir définir correctement des alias sur les entiers signés et non signés. Par exemple un entier non signé correspondrait à l'alias uint32 sur une architecture 32 bits tandis que le même entier correspondrait à l'alias uint64 sur une architecture 64 bits.
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Par exemple un entier non signé correspondrait à l'alias uint32 sur une architecture 32 bits tandis que le même entier correspondrait à l'alias uint64 sur une architecture 64 bits
    Les types n'ont pas forcément les mêmes tailles d'une architecture 64 bits à une autre. Donc il faudra bien que tu trouves un moyen de gérer chacune individuellement.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet, sur Win64 par exemple, il me semble bien qu'un unsigned int reste un UINT32 : C'est surtout la taille des pointeurs et des size_t qui change.
    Donc, je pense que le mieux est d'utiliser les types standard (uint32_t, etc.) pour tes alias, plutôt que de les redéfinir toi même...
    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.

  11. #11
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par Médinoc
    En effet, sur Win64 par exemple, il me semble bien qu'un unsigned int reste un UINT32 : C'est surtout la taille des pointeurs et des size_t qui change.
    Donc, je pense que le mieux est d'utiliser les types standard (uint32_t, etc.) pour tes alias, plutôt que de les redéfinir toi même...
    Ah mince je pensais pourtant qu'un entier non signé sur une architecture 64 bits faisait 8 octets partout . Désolé d'avoir dit une bêtise.

    Les alias dont tu parles sont-ils disponibles sur la plupart des compilateurs ? Si oui, quel est le fichier à inclure ?
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par nicolas66
    Les alias dont tu parles sont-ils disponibles sur la plupart des compilateurs ? Si oui, quel est le fichier à inclure ?
    Je ne crois pas qu'il y ait quelque chose de standard à ce niveau là. Par contre, boost fournit une solution, avec les [it]integer traits[/ti] : http://www.boost.org/libs/integer/integer.htm.

  13. #13
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par nicolas66
    Ah mince je pensais pourtant qu'un entier non signé sur une architecture 64 bits faisait 8 octets partout . Désolé d'avoir dit une bêtise.
    A vrai dire, la seule chose dont on puisse etre sur, car c'est la seule spécificité explicitement indiquée (du fait de l'héritage C)
    char <= int <= long <= float <= double signe <= double non signé.

    Ce que l'on peut aussi dire, c'est que si tu appelle sizeof(type) l'unité représente le char (qui pourrait tout aussi bien etre représenté sur 8 que sur 16 bits... voire meme plus)

    Partant de là, il pourrait meme à l'extrème limite etre *théoriquement* possibe de trouver une architecture sur laquelles tous les types auraient la meme taille, vu que toutes les inégalités sont de type "plus petit ou égale au suivant"

    Au passage, il me *semble* (pour ce que je m'en souvient de l'avoir entendu au cours d'une discution) que les mainframe actuels sont également en architecture 64 bits
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je précise que je souhaite détecter les architectures 64 bits pour pouvoir définir correctement des alias sur les entiers signés et non signés. Par exemple un entier non signé correspondrait à l'alias uint32 sur une architecture 32 bits tandis que le même entier correspondrait à l'alias uint64 sur une architecture 64 bits
    En général on cherche à faire l'inverse : on cherche le bon type pour une taille souhaitée. Si tu veux les types d'entiers qui correspondent le mieux à la plateforme, alors ce sera juste int / unsigned int.

Discussions similaires

  1. Simulation d'une architecture de détection d'intrusion sous NS2
    Par elajjouri dans le forum Développement
    Réponses: 1
    Dernier message: 12/07/2014, 04h26
  2. Réponses: 7
    Dernier message: 21/10/2004, 09h13
  3. Réponses: 3
    Dernier message: 23/06/2004, 21h17
  4. Réponses: 2
    Dernier message: 14/06/2004, 15h18
  5. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25

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