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

Visual C++ Discussion :

Diff 32 bits et 64 bits


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut Diff 32 bits et 64 bits
    Si j'ai bien lu la doc MS, les différences entre du code 32 bits et 64 bits sont uniquement size_t et ptrdiff_t qui deviennent 64 bis (outre tous les pointeurs bien sûr). Le reste ne change pas, à savoir les "int" et "unsigned int" ainsi que "long" et "unsigned long" reste en 32 bits.

    Qu'en est-il des valeurs "implicites", comme les sizeof() ou les enum ?
    Par exemple si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i;
    i=sizeof(T);//sizeof() -> 64 bits ?
    Ne devrait-il pas y avoir un warning ?

    Autre question.
    Est-ce vrai pour tous les compilateurs 64 bits ? Ou pourrait-il y avoir des problèmes de compatibilité ? (à priori je ne ferais jamais de code portable autre que pour Linux, Mac et Windows, du intel quoi).

    Merci

    EDIT, j'oubliais un détail important: peut-on allouer des blocks mémoire de plus de 32 bits (>4Gb), avec par exemple
    char *ptr=new char[65536*65536*65536]; ?

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par camboui Voir le message
    Ne devrait-il pas y avoir un warning ?
    Pourquoi est-ce qu'il y en aurait un ? sizeof renvoie une taille en "nombre de char", donc pourquoi la taille maximale des entiers devrait-elle jouer le moindre rôle là-dedans ?
    EDIT : lu trop vite. Tu peux avoir un warning "Conversion may lose significant digits" ou équivalent, cf. dernier point de réponse sur size_t. Toutefois, c'est très mal / crade d'affecter le résultat d'un sizeof à autre chose qu'une variable de type size_t...

    Citation Envoyé par camboui Voir le message
    Est-ce vrai pour tous les compilateurs 64 bits ?
    C'est lié au C/C++, et non pas à la taille du mot-machine. Donc, oui, ça marche tout le temps en ce qui concerne le sizeof.
    Pour les diverses tailles des types standards, je n'ai jamais regardé explicitement ce qui était prévu je dois dire. C'est soit à voir au cas par cas, soit à blinder via des entêtes de définition de type de taille donnée / vérification des tailles des types de base.

    Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #if (sizeof(int)!=4)
      #pragma error Unsupported "int" size.
    #endif
    Ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #if (sizeof(int)==4)
      typedef int INT32 ;
    #else
      #if (sizeof(long int)==4)
        typedef long int INT32;
      #else
        #pragma error Could not find 32 bits integer type.
      #endif
    #endif
    Le plus pratique reste quand même, je pense, d'utiliser une librairie d'abstraction (POCO ou ACE) qui fera tout ça à ta place, et qui (en plus !) t'apportera directement la portabilité vers tous les OS supportés par ladite librairie, à peu de choses près.

    Citation Envoyé par camboui Voir le message
    EDIT, j'oubliais un détail important: peut-on allouer des blocks mémoire de plus de 32 bits (>4Gb), avec par exemple
    char *ptr=new char[65536*65536*65536]; ?
    Affiches "sizeof(size_t)" et tu auras la réponse. Si c'est 4, la réponse est "non". Si c'est 8, la réponse est "oui".
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Toutefois, c'est très mal / crade d'affecter le résultat d'un sizeof à autre chose qu'une variable de type size_t...
    Je vais essayer de retenir ça
    Merci.

    Le problème n'est pas dans les nouveaux développements.
    Mais porter des dizaines de milliers de lignes de code (dont certaines datent de l'époque 16 bits) écrites par les zillions de personnes qui sont passées par est au delà de l'usage de librairie récentes...

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Dans ce cas, il faut surtout chercher les sizeof dans le code, voir à quoi ils sont affectés, et voir si cela a une incidence en modifiant le type source et en laissant ensuite le compilo gueuler en niveau maximal de warnings.

    Toutefois, si des bouts de code proviennent du monde 16 bits, je ne saurais trop te conseiller de blinder tes fichiers à coup d'entêtes de vérification des tailles / types comme je te l'ai mis en exemple ci-dessus.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Voici le genre de code simple qui compile et ne génère aucun warning:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::string s;
     
    ...
     
    //genre de ligne probablement déjà modifiée lors du passage 16->32 bits:
    unsigned short u=reinterpret_cast<unsigned short>(s.length());
    fwrite(f,&u,sizeof(u));
    Bref, pas toujours évident de décider ce qu'il faut faire. Surtout si on veut conserver la compatibilité avec des fichiers binaires existants dans lesquels on a sérialisé plein de valeurs 16 bits.

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Ben forcément, avec un cast... Ceci étant dit, tu peux, comme je te l'ai dit, chercher sizeof dans le code et regarder l'impact.

    De toutes façons, un bon portage devrait, normalement, vérifier un maximum de ligne de code si le programme n'est pas basé intégralement sur une librairie d'abstraction.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Pour les diverses tailles des types standards, je n'ai jamais regardé explicitement ce qui était prévu je dois dire.
    C'est du spécifique à l'implémentation. Les seules choses définis par le standard sont sizeof(char)=1<=sizeof(short)<=sizeof(int)<=sizeof(long)(<=sizeof(long long) en C++0x) ainsi que les min représentables de chacun de ces types. Ensuite chaque compilo/plateforme a le choix des tailles effectives de ces types.
    A noter que sizeof(char)=1 ne veut pas dire 1 octet, mais que la valeur de sizeof(char) est 1. Il n'y a pas d'unité en somme.

Discussions similaires

  1. Quel est la diff entre windows 32 bits et 64 bits
    Par pierrot10 dans le forum Windows XP
    Réponses: 4
    Dernier message: 15/08/2006, 15h42
  2. Le wave 32 bits -> wave 8 bits
    Par troumad dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 03/04/2006, 11h00
  3. Comment convertir une image 24 bits en 8 bits ?
    Par James64 dans le forum Langage
    Réponses: 22
    Dernier message: 13/12/2004, 20h12
  4. [debutante] Conversion 8 bits en 16 bits
    Par bolo dans le forum Algorithmes et structures de données
    Réponses: 28
    Dernier message: 06/12/2004, 23h20
  5. Machine 32 bits - cryptage 128 bits
    Par free0pen dans le forum Assembleur
    Réponses: 6
    Dernier message: 02/04/2004, 20h14

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