J’ai remarqué que le code C et C++ moderne semble utiliser au lieu de
/ `` peu partout - dans les paramètres pour les fonctions de chaîne C à la STL. Je suis curieux de savoir la raison de cela et les avantages qu’il apporte.
Réponses
Trop de publicités?size_t est du type entier non signé du résultat de l'opérateur sizeof (et de la offsetof opérateur) de sorte qu'il est garanti d'être assez grand pour contenir la taille du plus grand objet de votre système (par exemple, un tableau statique de 8 go).
Il peut être plus grande, égale ou même inférieure à celle d'un unsigned int et votre compilateur peut faire l'hypothèse à ce sujet pour l'optimisation de but.
Vous pouvez trouver plus d'informations précises sur le standard C99 (section 7.17), dont un projet est disponible sur Internet en format pdf , un format ou dans la section 7.19 de la norme C11, également disponible en pdf projet
Classique C (le dialecte début de C décrit par Brian Kernighan et Dennis Ritchie dans The C Programming Language, Prentice-Hall, 1978) n’a pas fourni de size_t. Le Comité des normes C introduit size_t pour éliminer un problème de portabilité
Expliqué en détail à embedded.com (avec un très bon exemple)
En bref, size_t n'est jamais négatif, et il optimise les performances, car il est typedef pour être le type entier non signé qui est assez grand, mais pas trop grand -- pour représenter la taille de la plus grande possible de l'objet sur la plate-forme cible.
Les tailles ne doivent jamais être négatif, et, en effet, size_t est un type non signé. Aussi, parce que size_t est pas signé, vous pouvez stocker les numéros qui sont à peu près deux fois plus grande que dans le type signé, parce que nous pouvons utiliser le bit de signe pour représenter l'ampleur, comme tous les autres bits de l'entier non signé. Quand nous gagnons un peu plus, nous sommes en multipliant la plage de nombres, nous pouvons représente par un facteur de deux.
Donc, vous demandez-vous, pourquoi ne pas simplement utiliser un unsigned int
? Il peut ne pas être en mesure de tenir assez grand nombre. Dans une mise en oeuvre unsigned int
est de 32 bits, le plus grand nombre, il peut représenter est 4294967295
. Certains processeurs, tels que la IP16L32, vous pouvez copier des objets de plus de 4294967295 octets.
Donc, vous demandez-vous, pourquoi ne pas utiliser un unsigned long int
? Elle exige une performance sans frais sur certaines plates-formes. C Standard exige qu'un long
occupent au moins 32 bits. Un IP16L32 plate-forme met en œuvre chaque long 32 bits comme une paire de mots de 16 bits. Presque tous les 32-bit les opérateurs sur ces plates-formes ont besoin de deux instructions, si pas plus, parce qu'ils travaillent avec le 32 bits dans deux de 16 bits morceaux. Par exemple, le déplacement d'un long 32 bits nécessite généralement deux instructions machine, l'une pour le déplacement de chaque 16 bits morceau.
À l'aide de size_t évite cette performance sans frais. Selon ce fantastique article, "Type size_t est un typedef, c'est un alias pour certains type entier non signé, généralement unsigned int ou unsigned long, mais peut-être même unsigned long long. Chaque Norme C mise en œuvre est censé choisir le nombre entier non signé qui est assez grand--mais pas plus grand que nécessaire--pour représenter la taille de la plus grande possible de l'objet sur la plate-forme cible."
Le type size_t est le type retourné par l'opérateur sizeof. Il est un entier non signé capable d'exprimer la taille en octets de mémoire pris en charge sur la machine hôte. Il est (généralement) liées à ptrdiff_t dans ce ptrdiff_t est un entier signé valeur tels que sizeof(ptrdiff_t) et sizeof(size_t) sont égaux.
Lors de l'écriture de code C, vous devez toujours utiliser size_t chaque fois que de traiter avec des plages de mémoire.
Le type int sur l'autre main est essentiellement définie comme la taille de l' (signé) valeur entière que la machine hôte peut utiliser le plus efficacement possible d'effectuer l'arithmétique des nombres entiers. Par exemple, sur de nombreux anciens de type PC ordinateurs de la valeur de sizeof(size_t) serait de 4 (octets), mais sizeof(int) serait de 2 (octet). 16 bits arithmétique a été plus rapide que le 32 bits, l'arithmétique, bien que le PROCESSEUR peut gérer une (logique) de l'espace mémoire de 4 Go.
Utiliser le type int seulement quand vous vous souciez de l'efficacité réelle de la précision dépend fortement sur les deux options du compilateur et de l'architecture de la machine. En particulier, la norme spécifie les éléments suivants invariants: sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) sans autres limitations de la représentation réelle de la précision à la disposition du programmeur pour chacun de ces types de primitives.
Remarque: Ce n'est PAS le même qu'en Java (ce qui indique le peu de précision pour chacun des types de 'char', 'octet', 'courte', 'int' et 'long').
Type size_t doit être assez grand pour stocker la taille de n’importe quel objet possible. UnsignedInt n’a pas à satisfaire cette condition.
Par exemple dans les systèmes 64 bits int et int unsigned peut-être 32 bits de large, mais size_t doit être assez grand pour stocker des nombres plus grand que 4G