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 :

Questions C++ : Short/Int et inline


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Questions C++ : Short/Int et inline
    Bonjour à tous,


    Je suis en train de mapper des données de base de données avec des membres C++, et j'ai des données qui vont de 1 à 10 par là.

    Est-ce que je les met dans un unsigned short ou un unsigned int ?
    Unsigned, la compteur commençant à 1, la valeur 0 suffira pour indiquer que la donnée n'est pas positionnée (pas besoin de -1) mais int ou short... je suis allé faire un tour dans les types du C++ et je me rend compte que ce sont les mêmes...

    A moins que j'utilise un unsigned char ? Vous feriez quoi ?


    Et autre chose concernant les fonctions inline. J'ai vu que c'était un peu les macro du C++, pour générer le code de la fonction inline directement à l'appel, comme les macro, mais en conservant le type.
    J'ai lu également que si l'on en mettait pas, le compilateur allait en assigner intelligemment, et que si on en met trop le compilateur en refuserai.

    Si ça ne fait que remplacer du code, on perd en temps de compilation j'imagine, mais on y gagne en exécution, c'est dangeureux d'en abuser ?


    Merci

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    NairodDorian
    Invité(e)
    Par défaut
    Est-ce que je les met dans un unsigned short ou un unsigned int ?
    Les processeurs x86 préfèrent travaillés avec 32 bits ou 8 bits mais pas avec 16 bits. Donc unsigned char ou unsigned int mais surement pas unsigned short sinon le compilateur génèrera systèmatique movsz. Quand à moi je te conseil unsigned int.

    c'est dangeureux d'en abuser ?
    En général on inline pas tout est n'importe quoi. Un bon compilo décidera seul si c'est vraiment utile que t'es déclaré ta fonction inline. Si t'es débutant laisse bossé le compilo surtout si t'as MSC++ avec l'option /GL.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Moi je part du principe qu'en C++ si l'on a besoin d'un entier on utilise int, sauf si on a une bonne raison pour utiliser autre chose.

    Ici je ne vois pas l'intérêt d'utiliser un non-signé par exemple, à part augmenter la probabilité d'un bug du à l'arithmétique plus compliquée des non-signés.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Utiliser des entiers non signés est plus long à l'exécution ?
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  5. #5
    NairodDorian
    Invité(e)
    Par défaut
    Bien sûr que non.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Utiliser des entiers signés pour des indexes ça fait des bugs de sécurité évidents.
    Boost ftw

  7. #7
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    Pour l'inlining, oui, ça peut être dangereux d'en abuser:
    - Les fonctions inline doivent être implémentées dans des fichiers en-têtes => peut augmenter considérablement le temps de compilation
    - Parce que la fonction appelant est directement remplacé par le corps de la fonction, ceci peut augmenter la taille de l'exécutable et peut même dans certains cas diminuer les performances
    - En générale, on inline les fonctions très simples et qui ne font pas appel à d'autres fonctions

  8. #8
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Je sais que dans beaucoup de cas, tu peux avoir besoin d'un indice spécial qui désigne une valeur invalide, où souvent -1 est utilisé.

    Chez Dassault Systemes, ils utilisent '0' pour ça et les indices valides commencent à 1, mais je trouve ça naze parce que les risques de confusion sont grands.

    Ce que tu peux faire, c'est faire une valeur constante UNDEF = static_cast<size_t>(-1).

    Ca limitera simplement la taille théorique de ton tableau à 2^32 - 1, et tu gardes tous les avantages à ne pas avoir à caster avec un size_t, etc...

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Utiliser des entiers signés pour des indexes ça fait des bugs de sécurité évidents.
    Tu peux donner un exemple ?

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Exemple trouvé rapidement avec Google
    http://msdn.microsoft.com/en-us/library/ms972705.aspx
    Boost ftw

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Bof, l'article parle plus du danger d'utiliser des types trop petits que d'utiliser des non-signés.

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    C'est parce que tu l'as mal compris.
    Boost ftw

  13. #13
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    D'après cet article, les unsigned ne sont pas vraiment mieux (cf. exemple du malloc et de l'overflow sur l'unsigned char).

  14. #14
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    Je suis en train de mapper des données de base de données avec des membres C++, et j'ai des données qui vont de 1 à 10 par là. A moins que j'utilise un unsigned char ? Vous feriez quoi ?
    Tout dépend de la quantité de données que tu as à stocker en mémoire. Moi, personnellement, pour compter de 1 à 10, j'utiliserais allègrement un unsigned char, voire même un partitionnement bit à bit dans une structure. Par contre, je conserverais quand même int pour toutes les variables « de travail » (indices de boucles, etc.) de façon à respecter le format du bus et des registres du processeur.

    Et autre chose concernant les fonctions inline. J'ai vu que c'était un peu les macro du C++, pour générer le code de la fonction inline directement à l'appel, comme les macros [...] Si ça ne fait que remplacer du code, on perd en temps de compilation j'imagine, mais on y gagne en exécution, c'est dangeureux d'en abuser ?
    Attention à ne pas confondre. Les « macros » existent en C et C++. Les inline s'évaluent de la même façon que les fonctions ordinaires mais leur code est dupliqué directement plutôt qu'appelées en utilisant la pile. Je ne pense pas que le surcoût en temps de compilation soit vraiment mesurable, à moins d'utiliser des fonctions inline géantes, ce qui n'aurait précisément aucun sens.

    Il n'est pas spécialement dangereux de les utiliser sauf dans un cas (bête) : celui où une fonction serait tellement répandue que l'on voudrait augmenter les perfs en diminuant le temps d'appel à chaque fois. On risque surtout de factoriser l'augmentation en taille et ça peut être dramatique pour un gain en vitesse quasi-nul.

    Pour le reste, les cas où inline sont utiles sont tellement précis que l'on peut affirmer sans risque : « si tu ne sais pas à quoi ça sert, tu n'en as probablement pas besoin ».

    Les cas où inline peut être intéressant est lorsque qu'une fonction simple est appelée dans une boucle. On gagne la durée du saut à chaque passage et le code inséré au milieu de l'environnement peut-être optimisé par le compilo (registres), on évite de vider le contenu du pipe-line, etc.

    À examiner au cas par cas, donc.

  15. #15
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    Citation Envoyé par Obsidian
    Je ne pense pas que le surcoût en temps de compilation soit vraiment mesurable
    Bien sûr, ça n'a aucun impact sur le temps de compilation quand tu modifies l'implémentation d'une fonction inline qui se trouve dans un fichier en-tête "includé" par 50 autres fichiers en-têtes

  16. #16
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    C'est ce que j'explique dans mon troisième paragraphe.

    Et même là, malgré tout, quand tu te retrouves à inclure une fonction inline dans cinquante fichiers d'entête, déjà, il doit y avoir quelque chose de pas correct, à mon avis, mais surtout, si ta fonction inline est suffisamment conséquente pour ralentir la compilation, c'est qu'elle ne doit pas être inline.

    À moins que tu parles des dépendences entre les fichiers à la compilation et, dans ce cas, ce n'est pas le fait que la fonction soit inline qui provoque la recompilation en cascade ...

  17. #17
    screetch
    Invité(e)
    Par défaut
    si c'est pour le stockage ca peut valoir le cout de sauver un octet ou deux par structure. sinon, il vaut mieux utiliser la plus grande capacité pour eviter de se retrouver avec des maths fausses. et n'utiliser signed int que si le resultat est vraiment signé.
    Au niveau generation de code, ca ne changera rien, et c'est au compilateur d'effectuer ce genre d'operations correctement, pas a celui qui ecrit.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/04/2010, 16h28
  2. Tester un type short, int, float en même temps.
    Par franculo_caoulene dans le forum C#
    Réponses: 2
    Dernier message: 06/05/2009, 16h02
  3. ['biess Question]Float to int - précision
    Par Antho42 dans le forum C#
    Réponses: 4
    Dernier message: 26/03/2009, 15h59
  4. [type]question bete de int range
    Par banzzai dans le forum Administration
    Réponses: 2
    Dernier message: 17/05/2006, 09h37
  5. short int et int
    Par gaut dans le forum C
    Réponses: 3
    Dernier message: 07/02/2004, 21h06

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