30 votes

size_t vs int avertissement

Je reçois un avertissement suivant toujours pour le type suivant de code.

``

Je comprends que les retours , je voulais juste savoir est-ce sûr d'ignorer cet avertissement ou devrais-je faire toute ma boucle variable de type``

41voto

Ben Voigt Points 151460

Si vous pourriez avoir besoin de détenir plus d' INT_MAX d'éléments dans votre vecteur, utilisez size_t. Dans la plupart des cas, il n'a pas vraiment d'importance, mais j' size_t juste pour faire la mise en garde de s'en aller.

Mieux encore, utiliser des itérateurs:

for( auto it = v.begin(); it != v.end(); ++it )

(Si votre compilateur ne supporte pas C++11, utilisez std::vector<whatever>::iterator à la place de auto)

C++11 a également fait le choix du meilleur type d'index plus facile (dans le cas où vous utilisez l'index dans le calcul, non seulement pour subscripting v):

for( decltype(v.size()) i = 0; i < v.size(); ++i )

15voto

Alok Save Points 115848

Qu'est - size_t?
size_t correspond à l'intégrale type de données renvoyé par la langue de l'opérateur sizeof et est définie dans le fichier d'en-tête (entre autres) comme un unsigned integral type.

Est-il acceptable de jeter size_t de int?
Vous pouvez utiliser un cast si vous êtes sûr que la taille n'est jamais va être > que INT_MAX.

Si vous essayez d'écrire un code portable, c'est pas sûr car,

size_t en 64 bit Unix est 64 bits
size_ten 64 bit Windows est 32 bits

Donc, si vous portez votre code d'Unix vers WIndows, et si au-dessus sont les enviornments vous risquez de perdre des données.

Proposition De Réponse

Compte tenu de la mise en garde, la suggestion est de faire de la i de unsigned integral type ou encore mieux de l'utiliser comme type size_t.

8voto

Billy ONeal Points 50631

est-ce sûr d'ignorer cet avertissement ou dois-je faire tous mes variable de boucle de type size_t

Pas de. Vous êtes vous-même ouverture à une classe de débordement d'entier attaques. Si le vecteur de taille est supérieure à MAX_INT (et un attaquant a une façon de faire qui se produisent), la boucle s'exécute indéfiniment, provoquant un déni de service possible.

Techniquement, std::vector::size retours std::vector::size_type, cependant.

Vous devez utiliser le droit de ce paramètre pour votre compteur de boucle variables. (Vraiment, pour la plupart des utilisations, vous voulez des entiers non signés, plutôt que des nombres entiers signés pour les boucles de toute façon)

4voto

tylerl Points 14541

Le problème est que vous mélangez deux types de données différents. Sur certaines architectures, `` est un 32 bits entier, sur d'autres c'est 64 bits. Votre code doit gérer correctement les deux.

depuis retourne un (pas int), alors que devrait être le type de données que vous comparez avec.

2voto

Jon Points 2160

Voici une autre vue de Bjarne Stroustrup: http://www.stroustrup.com/bs_faq2.html#simple-program

for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n';

Oui, je sais que je déclare que j'ai à être un vecteur::size_type plutôt que de plaine int de calme mises en garde de certains hyper-suspect les compilateurs, mais dans ce cas,je pense que trop pédant et distrayant.

C'est un compromis. Si vous êtes inquiet que v. size() pourrait aller au-dessus de 2 147 483 647, utilisez size_t. Si vous utilisez j'ai à l'intérieur de votre boucle pour plus que juste la recherche à l'intérieur du vecteur, et vous êtes préoccupé par ce subtil signé/non signé des bogues, utilisation int. Dans mon expérience, cette dernière question est plus répandu que l'ancien. Votre expérience peut différer.

Voir aussi Pourquoi est size_t non signé?.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X