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

Contribuez C++ Discussion :

64 bits et C++


Sujet :

Contribuez C++

  1. #1
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut 64 bits et C++
    Bonsoir...

    Question peut-être idiote, mais la technologie 64 bits change-t-elle qqch à la programmation ?
    Par exemple, un float sera toujours codé en 32 bits ?
    Et si ça n'est pas le cas, y a-t-il des choses qui changent ? (mis à part la vitesse)


    [Sujet placé en post-it - vous êtes invités à l'agrémenter de toute remarque / expérience / conseil pertinent sur le développement 64 bits ]
    "Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois

  2. #2
    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
    Oui il y a des choses qui changent, notamment la taille des types primitifs. Un int, par exemple, sera certainement codé sur 64 bits sur une telle architecture.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Sur un compilateur c++ 64 bit, int continuera d'etre 32 bit, long sera 64 bit, et long long sera lui ausis 64 bit. char, short, float, double et long double ne changeront pas.

    Autre modification importantes: un pointeur sera sur 8 bytes. Ceux qui avaient encore la mauvais habitude de caster un pointeur en int pour en extraire l'adresse auront quelques problemes.

    Voici une liste non-exaustive de choses a faire attention:

    La conversion de long vers un double n'est pas safe, puisque long (64 bit) depasse la capacite d'un double. Utiliser un long double a la place.

    Porter une attention particuliere a l'inline assembly

    Utiliser les identificateur pour les limites des types plutot que la valeur numerique correspondante (CHAR_BIT, CHAR_MAX, INT_MIN, ...) (voir include <climits>)

    Privilieger l'utilisation de typedef dans votre code plutot que les type predefinit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef int           s32
    typedef unsigned int  u32
    typedef char          s8
    typedef unsigned char u8
    //...
    De cette facon, si un type change de grosseur d'un environnement a l'autre, les seuls changements que vous aurez a faire sera de modifier les typedef (a condition de n'utiliser que des s32, u32, etc dans votre code)


    Petite remarque, le standard c++ dicte cette regle sur la longueur des types: char <= short <= int <= long. Ce qui implique que cela risque de pouvoir varier d'un compilateur a l'autre. Sur 32 bit, la regle etait suivie (8, 16, 32, 32). Sur 64 bit aussi, mais peut etre certains compilateurs implanteront int = long = 64) Encore une fois, utilisez climits[/code]

    Bon, je dis ca de souvenir, il y a surement d'autre details importants

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Citation Envoyé par voider
    Autre modification importantes: un pointeur sera sur 8 bytes.
    Hum, ça veut dire qu'on ne peut adresser que 256 mots en mémoires ?

  5. #5
    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
    8 bytes = 64 bits.

  6. #6
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Merci pour ces éclaircissements, c'est vrai qu'on était en droit de se poser la question...
    Ca veut dire qu'il va vraiment falloir faire gaffe à tous les anciens bouts de codes qui utilisaient par exemple aveuglément la taille des types de façon explicite ou non...
    "Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par voider
    Sur un compilateur c++ 64 bit, int continuera d'etre 32 bit, long sera 64 bit, et long long sera lui ausis 64 bit. char, short, float, double et long double ne changeront pas.
    Ca dépend de quel 64 bits. Il en existe pour char/short/int/long je crois des 8/16/32/64 et des 8/16/64/64, et rien n'empêche des 8/32/64/64 ou des 8/32/32/64.


    Citation Envoyé par voider
    Autre modification importantes: un pointeur sera sur 8 bytes.
    En général, ok. Mais rien ne l'oblige.
    Citation Envoyé par voider
    Ceux qui avaient encore la mauvais habitude de caster un pointeur en int pour en extraire l'adresse auront quelques problemes.
    Ceux là avaient probablement des problèmes avant. Je ne vois pas en quoi un tel cast peut être utile dans du code C++ valide.

    Citation Envoyé par voider
    La conversion de long vers un double n'est pas safe, puisque long (64 bit) depasse la capacite d'un double. Utiliser un long double a la place.
    Je ne suis pas certain de ce que tu veux dire par safe, mais il n'a jamais été certain en convertissant un long en double puis en long de retrouver la valeur initiale.
    Citation Envoyé par voider
    Utiliser les identificateur pour les limites des types plutot que la valeur numerique correspondante (CHAR_BIT, CHAR_MAX, INT_MIN, ...) (voir include <climits>)
    En C++ le header <limits> avec la classe numeric_limits remplace avantageusement ces valeurs.

    Citation Envoyé par voider
    Privilieger l'utilisation de typedef dans votre code plutot que les type predefinit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef int           s32
    typedef unsigned int  u32
    typedef char          s8
    typedef unsigned char u8
    //...
    De cette facon, si un type change de grosseur d'un environnement a l'autre, les seuls changements que vous aurez a faire sera de modifier les typedef (a condition de n'utiliser que des s32, u32, etc dans votre code)
    J'ai très rarement le besoin de savoir le nombre de bits qu'aura une variable (exception : Code pour écrire dans un format binaire multi-architecture, par exemple pour de la sauvegarde binaire ou de l'échange réseau binaire, mais de toute façon, dans ce genre de situation, je manipule surtout des tableaux de char, pour éviter les problèmes d'endianess). Le fait que int puisse avoir un nombre de bits variant suivant l'architecture est une feature. On est ainsi assuré en prenant int d'avoir la taille que le processeur gère le mieux. Ces typedefs me semblent donc être une mauvaise idée dans le cas général.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par voider
    Sur un compilateur c++ 64 bit, int continuera d'etre 32 bit, long sera 64 bit, et long long sera lui ausis 64 bit. char, short, float, double et long double ne changeront pas.
    Ca dépend de quel 64 bits. Il en existe pour char/short/int/long je crois des 8/16/32/64 et des 8/16/64/64, et rien n'empêche des 8/32/64/64 ou des 8/32/32/64.
    Voir la petite remarque que j'avais mit a ce sujet dans le bas de mon premier post


    Citation Envoyé par voider
    Ceux qui avaient encore la mauvais habitude de caster un pointeur en int pour en extraire l'adresse auront quelques problemes.
    Ceux là avaient probablement des problèmes avant. Je ne vois pas en quoi un tel cast peut être utile dans du code C++ valide.
    J'ai deja vu a quelques reprises du code du genre: std::cout << "Adresse de p:" << (unsigned int)p;

    Citation Envoyé par voider
    La conversion de long vers un double n'est pas safe, puisque long (64 bit) depasse la capacite d'un double. Utiliser un long double a la place.
    Je ne suis pas certain de ce que tu veux dire par safe, mais il n'a jamais été certain en convertissant un long en double puis en long de retrouver la valeur initiale.
    C'est evident que long > double > long ne garantit pas de revenir au resultat initial. Par contre, long depassera la capacite d'un double lors de la conversion long > double. Probleme qui n'est pas present en 32 bit.

    Citation Envoyé par voider
    Privilieger l'utilisation de typedef dans votre code plutot que les type predefinit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef int           s32
    typedef unsigned int  u32
    typedef char          s8
    typedef unsigned char u8
    //...
    De cette facon, si un type change de grosseur d'un environnement a l'autre, les seuls changements que vous aurez a faire sera de modifier les typedef (a condition de n'utiliser que des s32, u32, etc dans votre code)
    J'ai très rarement le besoin de savoir le nombre de bits qu'aura une variable (exception : Code pour écrire dans un format binaire multi-architecture, par exemple pour de la sauvegarde binaire ou de l'échange réseau binaire, mais de toute façon, dans ce genre de situation, je manipule surtout des tableaux de char, pour éviter les problèmes d'endianess). Le fait que int puisse avoir un nombre de bits variant suivant l'architecture est une feature. On est ainsi assuré en prenant int d'avoir la taille que le processeur gère le mieux. Ces typedefs me semblent donc être une mauvaise idée dans le cas général.
    Je parlais pour les cas ou il etait necessaire d'avoir un type de longueur fixe, peu importe le compilo/architecture (et pour eviter une reecriture/modification partout dans le code le cas echeant)

  9. #9
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    et concrètement, le fait de passer de 32 à 64 bits, ça apporte quoi en plus, en mieux ? en terme de performances, etc...

  10. #10
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    toutes vos questions n'ont de sens qu'avec un compilateur 64 bits.
    pour que ce dernier fonctionne, il faut un OS 64 bits qui lui même
    nécessite une machine 64 bits.

    Si vous continuer d'utiliser un compilo 32 bits sur un machine 64 bits,
    il n'y aura rien de changé. Je ne suis même pas sûr qu'il y aura une
    meilleure performance.

    à mon avis, si compilo 64 bits alors int = 64 bits

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    D'après ce que j'ai entendu, ça apporte pas grand chose en terme de performances. C'est surtout utile quand tu as besoin de bcp de mémoire.

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Au boulot on l'utilise pour une application devant gérer beaucoup de données CAO. Les perfs sont généralement un peu moins bonnes, mais on peut adresser suffisamment de mémoire pour stocker un modèle d'une voiture en mémoire.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  13. #13
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Il n'existe pas de bibliotheques permettant de gérer ce genre de trucs quelq qu soit le compilo / plate forme ?

    genre je déclare un uint32 il vas me créer un unsigned integer sur 32 bits...

    Si oui ca m'intéresse
    J'aime pas les épinards... Mais alors pas du tout

  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
    Il n'existe pas de bibliotheques permettant de gérer ce genre de trucs quelq qu soit le compilo / plate forme ?

    genre je déclare un uint32 il vas me créer un unsigned integer sur 32 bits...
    Un jour pour m'amuser, j'avais codé un truc à base de meta-prog qui trouve un type selon la taille que tu veux. Je sais pas si ça a une grande utilité, mais c'était marrant à coder.

  15. #15
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Bah l'utilité est dans le stockage binaire d'un fichier selon moi... c'est bien d'avoir un programme stable qui peux tout relire quelque soit le'OS / processeur

    Jusqu'a maintenant j'ai rien vu de simple a ce niveau la... selon moi c'est le probleme du C++. Il n'y a pas de variables vraiment définit dans leurs structures.
    J'aime pas les épinards... Mais alors pas du tout

  16. #16
    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 parlais de l'utilité du truc que j'avais codé .

    Concernant l'utilité d'avoir des types de taille fixe, je la vois bien dans la conception de mon moteur 3D. D'ailleurs c'est pas pour rien que les API 3D redéfinissent tous les types de base.

  17. #17
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    Le 64 bits sert dans 2 cas :
    - performances lorsqu'on travaille sur de très grands entiers (relativement rare)
    - besoin d'adresser plus de 4 Go de RAM à un seul processus.
    Хајде Јано коло да играмо

  18. #18
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par HRS
    toutes vos questions n'ont de sens qu'avec un compilateur 64 bits.
    pour que ce dernier fonctionne, il faut un OS 64 bits qui lui même
    nécessite une machine 64 bits.

    Si vous continuer d'utiliser un compilo 32 bits sur un machine 64 bits,
    il n'y aura rien de changé. Je ne suis même pas sûr qu'il y aura une
    meilleure performance.

    à mon avis, si compilo 64 bits alors int = 64 bits
    Je ne parle que de ce que j'ai pratiqué : HP, Sun, Linux(AMD) : se sont de modeles dit ILP32 ou LP64. C'est a dire en 32 bits int, long et pointer 32 bits

    et en 64 bits long et pointer 64 bits... et donc int 32 bits...

    Ceci dit cela n'exclu pas des modeles ILP64 ou autres... mais je n'en ai jamais rencontré...

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Loulou24
    Il n'existe pas de bibliotheques permettant de gérer ce genre de trucs quelq qu soit le compilo / plate forme ?

    genre je déclare un uint32 il vas me créer un unsigned integer sur 32 bits...
    Un jour pour m'amuser, j'avais codé un truc à base de meta-prog qui trouve un type selon la taille que tu veux. Je sais pas si ça a une grande utilité, mais c'était marrant à coder.
    stdint.h definit des types uint32_t int16_t...
    Intéressant aussi, il définit des types int_fast16_t, uint_fast8_t qui ont au moins la taille demandé et sont les plus rapides possibles.
    Sur x86, il prend des int (32 bits), sur x86_64 il doit prendre des long int (64 bits).

  20. #20
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    et y a pas un rapport avec le nombre d'instruction que le pross peux gerer ???

    avant sur les ancetres des pc en 8bits il n'existait que 256 instructions, maintenant 2^32.

    et je suis pas d'accord avec voider, sur une machine 64bits avec compilo 64bits un int devrait valoir 64bits.
    "vaste programme"

Discussions similaires

  1. 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
  2. Main icon (16 bits)
    Par DR dans le forum C++Builder
    Réponses: 2
    Dernier message: 02/09/2002, 08h23
  3. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27
  4. Debugger 16-32 bits
    Par Mat dans le forum Assembleur
    Réponses: 4
    Dernier message: 28/06/2002, 11h34
  5. Lire 1 bit d'un fichier en C
    Par Anonymous dans le forum C
    Réponses: 3
    Dernier message: 23/05/2002, 18h31

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