Envoyé par
tintin72
J'ai donc pris l'habitude de déclarer un int dès que j'ai besoin de stocker un entier.
Sage habitude, int est l'abréviation de integer, c-a-d entier en français.
Mais ce qui m'a fait tiquer c'est que lorsque j'utilise un vector de la stl par ex:
1 2
|
for(int i = 0; i < monVecteur.size(); i++) |
Le compilo me met un avertissement à cause de la comparaison entre un int
et un unsigned int (retourné par la méthode size).
Il existe des solutions pour palier à cela. Pour ma part je caste systématiquement
for(int i = 0; i < int(monVecteur.size()); i++)
Je trouve cela plus avantageux que d'utiliser des entiers non-signés, dont le maniement est plus dangereux, surtout comme indices. Le dernier bug auquel j'ai été confronté avec eux, par exemple, c'était une fonction de ce genre :
1 2 3 4
| void f(size_t first, size_t last)
{
for(size_t i = first; i <= last; ++i) {...}
} |
A priori rien de bien méchant. A part qu'à un moment j'ai eu besoin d'inverser la boucle
1 2 3 4
| void f(size_t first, size_t last)
{
for(size_t i = last; i >= first; ++i) {...}
} |
Et là boum, l'appel f(0, x) donne une boucle infinie, ce qui n'est pas évident de voir du premier coup, dans le feu de l'action d'une opération de maintenance urgente.
Alors est ce qu'il vaut mieux respecter scrupuleusement le type
de valeur attendue: déclarer un unsigned char pour un petit nombre non signé, un short int pour un nombre signé plus important etc... ou bien
mettre des int partout en espérant que le compilo ne se plaindra pas trop ?
Et est ce que cela fait gagner de l'espace mémoire (et éventuellement de la vitesse) ?
Personnellement, j'utilise int partout où j'ai besoin d'un entier sauf :
- Si j'ai une grande quantité de données à stoker (à partir de quelques millions, typiquement), j'utilise si possible un type plus petit pour diminuer l'espace mémoire et le temps d'accès. En dehors de ça, utiliser un type plus petit risque au contraire de ralentir, int est en général le type entier le plus rapide, car correspondant à la taille des registres du processeur.
- Si INT_MAX risque d'être trop petit, j'utiliserai un type plus grand
- Pour manipuler des bits, j'utiliserai unsigned car les opérations bit-à-bit y son mieux définies
Partager