C ++: Types de données à utiliser et quand?

On m’a dit que je devrais toujours utiliser size_t quand je veux des 32bit unsigned int , je ne comprends pas bien pourquoi, mais je pense que cela a quelque chose à voir avec cela si quelqu’un comstack le programme sur des machines 16 ou 64 bits, le unsigned int deviendrait 16 ou 64 bit mais size_t ne le sera pas, mais pourquoi pas? et comment puis-je forcer les tailles de bits exactement à ce que je veux?

Alors, où est la liste de quel type de données utiliser et quand? par exemple, existe-t-il une alternative size_t aux unsigned short ? ou pour 32bit int ? etc. Comment puis-je être sûr que mes types de données ont autant de bits que je l’ai choisi au départ et que je n’ai pas à me soucier des différentes tailles de bits sur d’autres machines?

La plupart du temps, je me soucie plus de la mémoire utilisée que du gain de vitesse que je tire de doubler l’utilisation de la mémoire, car je n’ai pas beaucoup de mémoire vive. Je veux donc cesser de m’inquiéter si tout se brise si mon programme est compilé sur une machine qui n’est pas en 32 bits. Pour l’instant j’ai utilisé size_t toujours quand je veux que ce soit 32bit, mais pour le moment je ne sais pas quoi faire. Quelqu’un m’aide à me vider la tête.

D’autre part: Si j’ai besoin d’une variable de taille 64 bits, puis-je l’utiliser avec succès sur une machine 32 bits? et quel est ce nom de type de données (si je veux qu’il soit toujours en 64 bits)?

size_t n’est pas toujours 32 bits. Par exemple, il est 64 bits sur les plates-formes 64 bits.

Pour les entiers de taille fixe, stdint.h est le meilleur. Mais il ne vient pas avec VS2008 ou avant – vous devez le télécharger séparément . (Il fait partie intégrante de VS2010 et de la plupart des autres compilateurs).

Comme vous utilisez VS2008, vous pouvez utiliser les types __int32 , unsigned __int32 , spécifiques à __int32 , etc. Documentation ici

Pour répondre à la question 64 bits: La plupart des compilateurs modernes ont un type 64 bits, même sur les systèmes 32 bits. Le compilateur fera de la magie pour le faire fonctionner. Pour les compilateurs Microsoft, vous pouvez simplement utiliser les __int64 ou unsigned __int64 .

size_t est destiné à stocker des tailles d’object. Il est exactement de la bonne taille pour cela et pour ce seul but – 4 octets sur les systèmes 32 bits et 8 octets sur les systèmes 64 bits. Vous ne devez pas le confondre avec unsigned int ou tout autre type de données. Cela peut être équivalent à unsigned int ou peut ne pas dépendre de l’implémentation (bitness du système inclus).

Une fois que vous avez besoin de stocker autre chose qu’une taille d’object, vous ne devez pas utiliser size_t , mais plutôt utiliser un autre type de données.

En guise de note: Pour que les conteneurs, pour indiquer leur taille, n’utilisent pas size_t , utilisez le container<...>::size_type

boost / cstdint.hpp peut être utilisé pour s’assurer que les entiers ont la bonne taille.

size_t n’est pas nécessairement 32 bits. Cela a été 16 bits avec certains compilateurs. Il est 64 bits sur un système 64 bits.

Le standard C ++ garantit, par référence à la norme C, une long au moins 32 bits.

int n’est que formellement garanti 16 bits, mais dans la pratique je ne m’inquiéterais pas: la probabilité que n’importe quel code ordinaire soit utilisé sur un système 16 bits est mince, et sur tout système 32 bits, l’ int est de 32 bits. Bien sûr, c’est différent si vous codez pour un système 16 bits comme un ordinateur embarqué. Mais dans ce cas, vous écririez probablement du code spécifique au système.

Si vous avez besoin de tailles exactes, vous pouvez utiliser si votre compilateur prend en charge cet en-tête (introduit dans C99 et le standard C ++ actuel depuis 1998) ou l’en-tête de bibliothèque Boost correspondant boost / cstdint.hpp .

Cependant, en général, utilisez simplement int . 😉

Cheers & hth.,

Malheureusement, l’une des particularités de la nature des types de données est que cela dépend beaucoup du compilateur que vous utilisez. Naturellement, si vous ne comstackz que pour une seule cible, vous n’avez pas à vous inquiéter – il suffit de déterminer la taille utilisée par sizeof(...) .

Si vous devez effectuer une compilation croisée, vous pouvez vous assurer de la compatibilité en définissant vos propres typedef pour chaque cible (blocs #ifdef entourés, référençant la cible à laquelle vous comstackz).

Si vous craignez que cela puisse être compilé sur un système qui utilise des types avec des tailles encore plus étranges que vous ne l’aviez prévu, vous pouvez toujours assert(sizeof(short)==2) ou équivalent, afin de pouvoir garantir à l’exécution vous utilisez les types correctement dimensionnés.

Votre question est étiquetée visual-studio-2008, je vous recommande donc de rechercher dans la documentation de ce compilateur les types de données prédéfinis. Microsoft dispose d’un nombre prédéfini, tel que BYTE , DWORD et LARGE_INTEGER .

Jetez un oeil dans windef.h winnt.h pour plus.