Dupliqué possible: strong>
Quand utiliser STD :: Taille_T? P> blockQuote>Bonjour. P>
En supposant que les modèles d'utilisation sont les mêmes (c'est-à-dire aucun chiffre négatif), qui est préférable à utiliser pour divers index,
int code> ouTaille_t code> type? P>Y a-t-il une différence de performance dans votre expérience sur Intel 64 bits entre les deux? p>
merci p>
4 Réponses :
Les types ne sont pas différents dans le sens que vous impliquez, et généralement En outre, vous devez noter que INT est signé, tandis que Taille_T n'est pas. P>
Enfin, int code> est 32bits et taille_t code> est la largeur du mot de la plate-forme (32-64 morceaux). Je vous suggère d'utiliser taille_t code> lorsque vous traitez avec des fichiers, des tampons et tout ce qui pourrait décrire une zone de mémoire ou un tampon. P>
int code> a été historiquement utilisé où taille_t code> doit être utilisé maintenant. Cependant, int code> est toujours utile dans son propre droit à d'autres fins. P>
Merci. J'essaie de normaliser dans mon projet de type particulier, d'améliorer les interfaces surtout, mais aussi de supprimer les avertissements du compilateur.
taille_t code> ou ptrdiff_t code>. int code> pourrait ne pas suffire à accéder à tous les éléments d'un tableau. P>
@ DAN04, il est fortement improbable que INT ne suffira pas. Plus important encore, c'est que les conteneurs standard utilisent Taille_T, et puisque INT est signé tant que Taille_T est non signé, vous pouvez obtenir des situations de comparaison entre types signés et non signés.
@Michael Aaron Safyan: tout à fait le contraire, int code> est essentiellement garanti d'être insuffisant en général, car il est signé i>, c'est-à-dire un bit pour le signe.
@Andreyt, en théorie, oui, mais dans la pratique, quand avez-vous vraiment un tableau de cette taille chargée dans la RAM? Si vous avez beaucoup chargé dans la RAM, il y a probablement quelque chose de mal à votre conception (vous devriez probablement être en streaming des données et utiliser des itérateurs), ou vous devriez vous inquiéter du type ... mais pour presque toutes les situations pratiques, vous allez à faire face à des tableaux beaucoup plus petits.
C'est comparer des pommes avec des oranges. Si " int code> n'est pas suffisant" est le problème, vous utiliseriez un long int code>. Taille_T CODE> et PTRDIFF_T CODE> Convey Semantitique Et c'est pourquoi ils doivent être utilisés ou non utilisés en fonction du contexte.
@Einpoklum: long int code> ne fonctionnera pas sur les plates-formes LLP64 comme MSVC ++. PTRDIFF_T CODE> est garanti de pouvoir stocker la différence entre deux pointeurs - ce qui est exactement ce qu'est un index de tableau est i>.
@ DAN04: bien, puis long long int code>. Même différence. Le point est que vous utiliseriez PTRDIFF_T CODE> - comme vous l'avez dit - pour la différence entre les pointeurs, non, par exemple, la différence entre la population actuelle de la planète de la planète et la population estimée à 1 000 CE.
@Einpoklum long int code> n'est pas garanti d'être plus grand que int code>, seulement pour être au moins aussi grand.
Cela dépend de ce que vous faites. Si vous êtes itération sur un vecteur, utilisez STD :: Taille_t: Toutefois, méfiez-vous des erreurs de codage tels que: p> Si vous faites une boucle, vous voudrez peut-être utiliser simplement une plaine de la situation en raison de la situation ci-dessus. Il ne devrait y avoir aucune différence de performance entre utiliser int et std ::ze_t. Si vous avez besoin d'une taille exacte, vous ne devez utiliser ni in int nize_t, mais plutôt les types définis dans STDINT.H . P> P>
Vous êtes itération sur un std :: vecteur <> code> (ou tout autre conteneur standard) que vous pourriez souhaiter utiliser std :: vecteur <> :: tad_type code> au lieu de raccourcissement directement à std ::ze_t code>.
@Andreyt, si l'on s'inquiète de généricité, il faut vraiment utiliser des itérateurs. Si on sourit une fonction rapide qui itière sur un vecteur, il n'y a rien à gagner de plus Verbose STD :: Vector :: Taille_Type au lieu de STD :: Taille_T.
Il se manquera peut-être quelque chose ici, mais pourquoi la deuxième boucle est-elle encore infinie?
Oh je viens de voir ça ... Size_t est non signé. nvm.
Lorsque vous travaillez avec un tableau em> spécifique em>, c'est-à-dire un tableau contenant des éléments spécifiques spécifiques à votre application, vous devez normalement avoir déjà un "type de choix" pour compter ou indexer les entités de ce type dans votre application. C'est le type que vous devez utiliser. Par exemple, si un tableau contient des enregistrements pour les employés de la société, vous devez déjà avoir un "type de choix" dans votre programme que vous utilisez pour désigner la "quantité d'employés". C'est le type que vous devez utiliser pour les tableaux d'indexation des enregistrements d'employés. Il pourrait être Remarque En outre, que Taille_t code> est le type qui doit être utilisé pour l'indexation de la matrice lorsque vous travaillez avec des tableaux de em> génériques relativement . C'est à dire. Lorsque vous avez juste un tableau d'abstrait char code> S, int code> s ou autre chose. p>
non signé INT code>, il pourrait être employé_count_t code> ou quelque chose comme ça. Utilisation d'un size_t code> à cette fin est une erreur de conception. P>
taille_t code> est un type non destiné à l'indexation de la matrice. C'est un type destiné à représenter la taille de l'objet le plus important du programme. Il "fonctionne" pour les tableaux par transitivité: les tableaux sont des objets, donc Taille_t code> est toujours suffisant pour indexer un tableau. Cependant, lorsque vous concevez un programme, il est plus logique de penser en termes de conteneurs génériques em>, au lieu de penser en termes de matrices spécifiques em>. Aujourd'hui, il pourrait s'agir d'une matrice, demain, vous devrez peut-être passer à une liste liée ou à un arbre. En général, la plage de taille_t code> n'est pas suffisante pour représenter le nombre d'éléments dans un conteneur abstrait, c'est pourquoi taille_t code> dans de tels cas n'est pas un bon choix. < / p>
@Andreyt, si demain, il pourrait s'agir d'une liste liée ou d'un arbre, un index de tout type n'est pas bon. Pour cela, vous avez besoin d'itérateurs.
@Michael Aaron Safyan: Pas nécessairement. Il est possible de construire une gamme segmentée de quelque sorte, pour laquelle le concept d'index est toujours logique et qui n'est néanmoins pas limité par la taille maximale d'un bloc de mémoire continue.
@Andreyt, mais les listes liées ne prennent pas en charge l'accès aléatoire ... Cela devient très piraté et aura probablement une très mauvaise performance. La solution la plus générale consiste à utiliser des itérateurs ou des visiteurs. Les indices ne font aucun sens pour les conteneurs d'accès aléatoire.
@Michael Aaron Safyan: Tout d'abord, comme je l'ai dit, on peut construire un conteneur à accès aléatoire i>, qui n'est pas limité de la taille du bloc de mémoire contiguë maximal, une "matrice segmentée" étant un exemple. Deuxièmement, si la performance des indices avec des listes est bonne ou non dépend du contexte. Ils pourraient être trop lents pour un accès direct de routine, mais ils pourraient être nécessaires pour la sérialisation.
@Michael Aaron Safyan: Tout d'abord, ils seraient nécessaires à la sérialisation dans une seule (sinon la seule) approche viable des références sérialisées dans une liste liée. Les pointeurs sont convertis en indices et à Vise Versa. Deuxièmement, personne ne parle que vous parlez de faire des fonctions API (comme opérateur [] code>) à cette fin. Mon point est simple: l'indexation est absolument nécessaire lorsque vous travaillez avec des listes liées dans certains contextes, et il n'y a rien d'inefficace sur l'indexation des listes liées si elles sont correctes.
@Michael Aaron Safyan: C'est exactement ce dont je parle: vous pouvez simplement garder un comptoir lorsque vous entrez dans la liste. Maintenant, revenons à la question originale: quel type allez-vous utiliser pour ce comptoir? Tout ce que je dis, c'est que, en général cas, taille_t code> n'est pas suffisant.
@Cha merci, je n'ai pas trouvé ce post auparavant.