• [^] # Re: Normalement tu n'as aucune garantie

    Posté par . En réponse au message Les espacements que mettent les compilateurs C dans les structures sont ils toujours les mêmes ?. Évalué à 2.

    Une dernière petite question: est-ce-que travailler avec des uint*_t en mémoire plutôt que les classiques int, long est moins performant ?

    Oui et non. Déjà, parce que performance, ça veut rien dire: performance en calcul, ou en place?
    Aussi parce que sur les plates-formes ou uint32_t ( par exemple ) est un define du int, non, par exemple, mais ça peut varier.

    Si la performance à ce niveau t'intéresse tant, je te conseille une petite lecture du fichier stdint.h. Plus précisément:

    /* Small types. */
    /* Signed. */
    typedef signed char int_least8_t;
    typedef short int int_least16_t;
    typedef int int_least32_t;
    #if __WORDSIZE == 64
    typedef long int int_least64_t;
    #else
    __extension__
    typedef long long int int_least64_t;
    #endif
    /* Unsigned. */
    typedef unsigned char uint_least8_t;
    typedef unsigned short int uint_least16_t;
    typedef unsigned int uint_least32_t;
    #if __WORDSIZE == 64
    typedef unsigned long int uint_least64_t;
    #else
    __extension__
    typedef unsigned long long int uint_least64_t;
    #endif
    /* Fast types. */
    /* Signed. */
    typedef signed char int_fast8_t;
    #if __WORDSIZE == 64
    typedef long int int_fast16_t;
    typedef long int int_fast32_t;
    typedef long int int_fast64_t;
    #else
    typedef int int_fast16_t;
    typedef int int_fast32_t;
    __extension__
    typedef long long int int_fast64_t;
    #endif
    /* Unsigned. */
    typedef unsigned char uint_fast8_t;
    #if __WORDSIZE == 64
    typedef unsigned long int uint_fast16_t;
    typedef unsigned long int uint_fast32_t;
    typedef unsigned long int uint_fast64_t;
    #else
    typedef unsigned int uint_fast16_t;
    typedef unsigned int uint_fast32_t;
    __extension__
    typedef unsigned long long int uint_fast64_t;
    #endif

    Donc, voila: en fonction de tes besoins, tu as des types différents.

    Sinon, j'ai noté l'utilisation d'un char, au milieu de types stdint, pourquoi ne pas avoir utilisé uint8_t? Ça me semblerait plus cohérent.

    Enfin, si tu ne veux pas utiliser packed mais que tu veux contrôler l'alignement, il existe de mémoire une syntaxe pour les bitfields en C. Je ne m'en souviens plus, c'est pas le genre de trucs que j'utilise souvent, mais c'est simple à retrouver.

    Bon, je mentionne surtout ça parce que tu risques d'y être confronté, et que c'est parfois intéressant si tu sais que tel variable est plus petite qu'un octet et que tu cherches une performance de taille maximale sans avoir à compresser par algo. Dans ton usage précis par contre, je ne pense pas que ce soit une solution acceptable.