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 :

Risque d'utiliser un tableau de char pour stocker de petits entiers ?


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut Risque d'utiliser un tableau de char pour stocker de petits entiers ?
    Bonjour.

    J'aurai souhaité savoir s'il y avait un "risque" (hormis peut être pour la lisibilité du code) d'utiliser un tableau de char pour y stocker de petits entiers ou cela se manipule exactement comme les short int, et les int ?

    Merci

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Lai,

    Quelle idée saugrenue.

    Un tableau de char ne se manipule pas comme comme un int (ou un short int), où as-tu pris cette idée ?

    Tu ne gagneras absolument rien, et tu perdras pas mal, alors oublie tout de suite.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut
    Oula, il y a peut être eu mauvaise interprétation de ce que j'ai voulu dire (en me relisant c'était en effet peut être pas clair). Ce que je voulais dire était : est-ce qu'un tableau de char se gère exactement de la même façon qu'un tableau de int ?

    En fait j'ai vraiment besoin d'économiser de la mémoire et j'ai seulement besoin de pouvoir stocker une valeur entre 0 et 20 dans mon tableau... Du coup si je ne peux utiliser qu'un octet par case, ce serait cool...

  4. #4
    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
    Salut,

    Si tes valeurs sont comprises entre 0 et 20, tu peux effectivement envisager l'utilisation d'un tableau de unsigned char, pour autant que tu sois certains des valeurs limites!!!!

    Cependant, je déconseillerais fortement de le faire à moins d'avoir vraiment de très bonnes raisons de le faire (un manque de mémoire ou d'une quantité pharaonique d'éléments)

    Ceci dit, dans certaines conditions, l'utilisation d'un tableau de caractères est le passage obligé, comme par exemple, s'il s'agit de charger en cache le contenu d'un fichier "binaire" (le très mal nommé)
    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

  5. #5
    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
    Pour moi :
    Un tableau de char stocke des caractères, pas des entiers.
    Un tableau d'unsigned char stocke des données 8 bits sur lesquelles on va faire des opérations bit à bit (le fait d'être unsigned évite plein d'erreurs sur ces manipulations).
    Un tableau de signed char stocke des petits entiers, sur lesquels on va faire des opérations arithmétiques (le fait d'être signed évite plein d'erreurs sur ces manipulations).

    Sachant que par tableau, si la taille est dynamique, j'entends std::vector.
    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.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Utilise uint8_t.

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par oodini Voir le message
    Utilise uint8_t.
    (dans stdint.h)

    ou std::uint8_t, dans <tr1/cstdint> (ou <cstdint> selon le compilateur et la version du standard supportée).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    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 oodini Voir le message
    Utilise uint8_t.
    Pourquoi uint8_t ? Comme le cas particulier 0 est dans la plage des nombres qu'il utilise, alors que 128 en est loin, utiliser un type signé me semble préférable...
    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.

  9. #9
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Pourquoi uint8_t ? Comme le cas particulier 0 est dans la plage des nombres qu'il utilise, alors que 128 en est loin, utiliser un type signé me semble préférable...
    +1
    Il stocke ok, mais il fait peut-être des traitements. Des fois qu'il fasse une boucle de décrémentation jusqu'à 0 s'il utilise des unsigned il risque de faire une boucle infinie, autant éviter ce cas.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Pourquoi uint8_t ?
    Parce que c'est sémantiquement plus conforme.
    Si on est laxiste sur la sémantique, autant utiliser un char.

  11. #11
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Citation Envoyé par oodini Voir le message
    Parce que c'est sémantiquement plus conforme.
    Si on est laxiste sur la sémantique, autant utiliser un char.
    Pas si ça peut induire un risque inutile. int8_t est plus conforme que le char et plus sûr que uint8_t dans la plage de valeur [0;20]

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Points : 63
    Points
    63
    Par défaut
    Salut,

    Sinon une autre solution serait de déclarer un type qui prend 5bits en mémoire, cela permet d'écrire des chiffres allant de 0 à 31 en prenant moins de place qu'un char (qui utilise 8bits); une structure fait l'affaire :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <stdio.h>
     
     
    struct petite_valeur {
     
    unsigned int valeur:5; // entier codé sur 5bits
     
    };
     
    int main() {
     
    struct petite_valeur valeur_test;
     
     
    valeur_test.valeur = 0;
     
    printf("%u\n", valeur_test.valeur); // Affiche 0
     
    valeur_test.valeur = 7;
     
    printf("%u\n", valeur_test.valeur); // Affiche 7
     
    valeur_test.valeur = 20;
     
    printf("%u\n", valeur_test.valeur); // Affiche 20
     
    valeur_test.valeur = 31;
     
    printf("%u\n", valeur_test.valeur); // Affiche 31
     
    valeur_test.valeur = 32;
     
    printf("%u\n", valeur_test.valeur); // Affiche 0 car le nombre n'est codé que sur 5bits
     
    valeur_test.valeur = 33;
     
    printf("%u\n", valeur_test.valeur); // Affiche 1 car le nombre n'est codé que sur 5bits
     
    //...
     
    return 0;
     
    }
    C++dialement,

    Pop360

  13. #13
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Pop360 Voir le message
    Salut,

    Sinon une autre solution serait de déclarer un type qui prend 5bits en mémoire, cela permet d'écrire des chiffres allant de 0 à 31 en prenant moins de place qu'un char (qui utilise 8bits); une structure fait l'affaire :

    <snip>

    C++dialement,

    Pop360
    Sauf que... Tu utilises un usigned int comme type de base dans ton champs de bits, et du coup, sizeof(petite_valeur) == sizeof(unsigned int).

    De manière générale, il n'est pas possible de créer un type dont la taille est inférieure à sizeof(char) == 1 byte (pas 8 bits ; les bytes en C++ n'ont pas un nombre de bits fixés par la norme).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    (pas 8 bits ; les bytes en C++ n'ont pas un nombre de bits fixés par la norme).
    Merci. Grâce à toi, j'ai appris qu'un byte n'était pas équivalent à un octet. Et merci à Wikipedia pour les éclaircissements supplémentaires. :-)

  15. #15
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Mue,

    Ok pour le int8_t, mais s'il y a beaucoup de calculs, ça va ralentir par rapport à l'utilisation d'un int normal, pour cause de désalignement des données en mémoire.
    Il faut donc voir si la quantité mémoire économisée justifie cette perte de performances, et il en faut beaucoup pour que ce soit le cas.
    Si les cons volaient, il ferait nuit à midi.

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Pourrais-tu expliciter ce point, droggo, STP ?

  17. #17
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Mai,

    Il suffit de récupérer les chartes des processeurs, et d'éplucher tout ça (cycles / instruction, qui varient selon les données, en particulier pour toutes les instructions impliquant des accès mémoire, pour des données non alignées sur la taille native du processeur).

    Tu trouveras ça sur le site Intel, en farfouillant un peu (rarement vu un site de grand fabricant aussi mal organisé, à moins qu'il l'aient refait entièrement depuis ma dernière visite ).
    Si les cons volaient, il ferait nuit à midi.

Discussions similaires

  1. [XL-2007] utiliser un tableau de données pour créer un état
    Par soledad_001 dans le forum Excel
    Réponses: 2
    Dernier message: 19/05/2014, 22h36
  2. Surface ou tableau de char pour les collisions?
    Par hardkey dans le forum SDL
    Réponses: 1
    Dernier message: 08/07/2011, 09h36
  3. Réponses: 8
    Dernier message: 16/04/2009, 06h51
  4. Utiliser un tableau de résultat pour faire une jointure
    Par Xavier1979 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/06/2007, 13h27
  5. [VB6] utilisation de Property LET / GET pour un tableau
    Par titounne dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 18/10/2004, 22h06

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