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 :

Comment savoir la taille d'une variable


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut Comment savoir la taille d'une variable
    Bonjour à tous,

    J'aimerai savoir si il existe un moyen de savoir la taille d'un objet non-fixe.
    Par exemple, j'ai un tableau à 2 dimensions de style tab[nbPoints][3] et j'aimerai savoir la taille qu'il prends en memoire.
    j'ai essayé de faire mets ca me retourne une taille de 8 octets pour plus de 330 000 points.

    J'aimerai aussi savoir cette methode pour savoir la taille d'un objet lui aussi dependant du nombre de points que j'utilise comme une boite noire, cad je l'utilise mais je ne sais pas ce qu'il y a derriere.

    Merci d'avance de vos reponses

    PS : je developpe sous VC++ 6.0

  2. #2
    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 670
    Points
    10 670
    Billets dans le blog
    3

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    Malheureusement je ne peux pas car le tableau mon tableau à 2 dimensions et ensuite un parametre de la fonction "boite noire" que j'utilise apres donc je ne peux pas utiliser un vector pour créer mon tableau

    petit precision, quand je parle de taille, je veux dire la taille en octet pris en memoire, pas le nombre d'elements du tableau

  4. #4
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bonjour,

    Dans un exemple comme celui-ci:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <conio.h>
     
     
    int main() {
     
    unsigned char TableauFixe[24];
    unsigned char *TableauVariable = NULL;
     
    TableauVariable = (unsigned char*)malloc(15*sizeof(unsigned char));
     
    cout << "Taille du tableau fixe" << sizeof(TableauFixe)/(sizeof(unsigned char)) << endl;
     
    cout << "Taille du tableau variable" << sizeof(TableauVariable)/(sizeof(unsigned char)) << endl;
     
    cin.ignore();
     
    }
    Il n'y a que la déclaration statique qui permet de calculer la taille.

    C'est le problème des tableaux ouverts, il faut toujours conserver leur taille, sinon l'information est perdue.

  5. #5
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    et une petite presicion sur sizeof, dans le cas d'un pointeur membre de ta classe (un buffer par exemple de 50000 valeurs)

    si tu fais sizeof(MaClass) la taille du pointeur a l'interieur de ton objet sera juste 1 car c'est la taille d'un int (une adresse, celle de ton pointeur en l'occurence) donc sizeof ne tiens pas compte de la memoire alloué pour ton pointeur il te retourne juste la taille d'un int pour chaque pointeur.

    XXiemeciel
    XXiemeciel

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    xxiemeciel :
    ...la taille du pointeur a l'interieur de ton objet sera juste 1 car c'est la taille d'un int....
    Non , la taille d'un pointeur. En général, c'est supérieur à 1 (et pour un int aussi)
    ... donc sizeof ne tiens pas compte de la memoire alloué pour ton pointeur il te retourne juste la taille d'un int pour chaque pointeur.
    Si on demande la taille d'un pointeur, il renvoie ... la taille d'un pointeur , pas d'un int et pas de l'objet pointé
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    ahah oui c'est une faute de ma part effectivement le sizeof d'un int c'est plus que 1.

    je pense c'est 4 pour les adresse car c'est de int 32 bits.

    sorry j'avais la tete ailleurs quand j'ai ecrit ca... mais le principe est bon

    XXiemeciel
    XXiemeciel

  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
    Non, il n'y a aucune relation a priori entre taille d'un int et taille d'un pointeur.

    On peut très bien imaginer parexemple des machines 64 bits, avec des adresses sur 64 bits mais des int qui restent sur 32 bits.
    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 averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Bon decidement je m'exprime mal,

    ce que je voulais dire c'est que sizeof va donner la taille de l'adresse et non de la memoire allouer pour le pointeur

    XXiemeciel
    XXiemeciel

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 94
    Points : 82
    Points
    82
    Par défaut Re: Comment savoir la taille d'une variable
    Citation Envoyé par killerjeff
    j'ai essayé de faire mets ca me retourne une taille de 8 octets pour plus de 330 000 points.
    Je crois qu'il y a une petite erreur, c'est que **tab renvoie la valeur du premier élément (tab[0][0]), et non celle du tableau tout entier. Dans l'idéal il faudrait boucler dans ton tableau mais la fin est indéterminée donc tu finiras par en sortir ce qui faussera le calcul.

    Donc, en fait, pas de solution pour moi

  11. #11
    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
    Citation Envoyé par JolyLoic
    Non, il n'y a aucune relation a priori entre taille d'un int et taille d'un pointeur.

    On peut très bien imaginer parexemple des machines 64 bits, avec des adresses sur 64 bits mais des int qui restent sur 32 bits.
    À priori, c'est justement le cas sous Win64...
    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.

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par JolyLoic
    Non, il n'y a aucune relation a priori entre taille d'un int et taille d'un pointeur.

    On peut très bien imaginer parexemple des machines 64 bits, avec des adresses sur 64 bits mais des int qui restent sur 32 bits.
    Pour résumer ce qui est imposé:
    • 1 char fait au moins 8 bits
    • sizeof(char) == 1
    • sizeof(long) >= sizeof(int) >= sizeof(short) >= sizeof(char)

    En pratique, tant qu'on ne travaille pas dans l'embarqué et ni avec des antiquités, on peut compter sur
    • 1 char fait 8 bits
    • sizeof(short) = 2
    • sizeof(int) = 4

    Avec des systèmes 32 bits, on a aussi
    • sizeof(long) == 4
    • sizof(type*) == 4

    En 64 bits, on a
    • sizeof(long) == 8 sauf, d'après ce que j'ai compris, sous Windows ou sizeof(long) == 4
    • sizeof(type*) == 8
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #13
    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
    Je crois que peux rajouter:
    sizeof(size_t) >= sizeof(type*)

    Edit: Tu sais, de base, un pointeur était sur 16bits, sur 386. Un pointeur far était sur 32.
    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.

  14. #14
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Médinoc
    Je crois que peux rajouter:
    sizeof(size_t) >= sizeof(type*)
    Non. (Exemple, les compilateurs C pour 8086 avaient un mode ou les pointeurs avaient une taille de 32 bits mais les objets avaient une taille maximale de 65535 et donc size_t etait sur 16 bits).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    Merci a tous et en particulier a kwakanar pour vos reponses.

    Je laisse le sujet ouvert au cas où quelqu'un aurai un coup de genie pour calculer la taille en memoire (vu que ca a l'air impossible il faut bien en coup de genie pour trouver )

    Merci encore

  16. #16
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Tu as compris mon exemple?

    D'ailleurs, c'est pour cette raison que des fonctions C, comme srtcpy, memcpy et cie, demandent toujours la taille du destinataire ou le nombre d'octet à copier.

    Il est impossible à ces fonctions de déduire la taille de la zone mémoire destination en se basant sur la taille du pointeur destination.

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    J'ai bien compris ce que tu as expliqué mais le probleme que j'ai, est de savoir quelle taille mon tableau occupe dans la RAM chose qui malheureusement a l'air impossible.

  18. #18
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    A moins de conserver la taille quelquepart au moment de l'allocation de memoire.

    XXiemeciel
    XXiemeciel

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    tu pourrai developper un peu plus ton idée xxiemeciel ?
    Car moi j'utilise une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AllocTab(int nbPoint, int nbCoord)
    qui me retourne le tableau. Le type du tableau et le code d'AllocTab sont intégré dans une DLL donc je ne peux pas le savoir

  20. #20
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Ce n'est pas aussi simple.

    Car ce n'est pas:

    Taille = sizeof(int)*nbPoint + sizeof(int)*nbCoord;
    Mais
    sizeof(unsigned char)*nbPoint *sizeof(unsigned char)*nbCoord;
    A cause de l'alignement mémoire, entre autre. Par contre, je ne suis pas sûr que ce soit fiable à 100%, il faut tester.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment calculer la taille d'une base de données ?
    Par say dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 01/04/2011, 16h48
  2. [XSL] Comment modifier la valeur d'une variable?
    Par sorcer1 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/02/2010, 13h26
  3. Comment vérouiller la taille d'une cellule [HTML]
    Par White_Angel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/04/2005, 14h19
  4. Réponses: 3
    Dernier message: 05/04/2005, 14h36

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