En ce qui concerne l’allocation de mémoire entière

Si la mémoire allouée à un entier a une limite (disons 2 octets en C ou 4 octets ou 8 octets) dans n’importe quelle langue. Comment est-il important de comstackr le code sur une machine 32 bits ou 64 bits en utilisant un compilateur 32 bits ou 64 bits. S’il vous plaît pardonnez-moi si c’est vraiment une question sortingviale. Mais s’il vous plaît laissez une réponse.

Si vous utilisez des types entiers de taille fixe (comme int8_t ou int16_t ), alors peu int16_t si vous ciblez une plate-forme 32 ou 64 bits.

Une des choses importantes est la taille des pointeurs. Tous les pointeurs sont 32 bits lorsque vous ciblez une architecture 32 bits et 64 bits lorsque vous ciblez une architecture 64 bits.

Il était plutôt courant de stocker des valeurs de pointeur dans un int , bien que cette pratique soit devenue très déconseillée pour des raisons de portabilité, et le cas 32/64 bits est un excellent exemple. Si vous stockez un pointeur dans un int , votre code invoquera un comportement indéfini sur les architectures 64 bits, car vous avez tronqué un pointeur. Lorsque vous alliez extraire le pointeur, vous déréféreriez le risque de plantage, ou (pire) vous utiliseriez des données non valides.

Il existe plusieurs raisons pour lesquelles vous devez comstackr différents exécutables entre des machines 32 bits et 64 bits – la taille d’un int peut ne pas être un facteur, ou peut-être, puisque le standard C ne définit que des tailles minimales et relatives – il n’y a pas taille maximale d’un int pour autant que je sache (à condition qu’il ne soit pas plus long qu’un long).

La taille d’un pointeur est une différence majeure. Le compilateur et l’éditeur de liens produisent une présentation différente du fichier exécutable entre les espaces d’adressage de processus de 32 et 64 bits. Les bibliothèques d’exécution sont différentes et les bibliothèques liées de manière dynamic ( objects partagés sous UNIX) doivent partager les mêmes pointeurs, sinon ils ne peuvent pas interagir avec le rest du processus.

Pourquoi utiliser 64 bits? Quel est l’avantage de 64 bits sur 32 bits? Le principal avantage est la taille maximale d’un pointeur, et donc l’espace d’adressage du processus. Sur 32 bits, il s’agit de 4 Go, sur 64 bits, de 16 Go (environ 16 000 téraoctets).

Si vous regardez cette page , vous pouvez voir que les types de base en C ont certaines tailles minimales garanties. Donc, vous ne trouverez pas d’implémentation C conforme où int est 2 bits, il doit être au moins 16.

Les différences entre les plates-formes rendent le portage de logiciels dans le défi intéressant qu’il est souvent.

Si vous avez du code qui suppose des choses sur les types de données de base qui ne sont pas garantis comme vrais (par exemple, du code qui fait quelque chose comme ceci: int x = 0xfeedf00d; ), alors ce code ne sera pas portable. Il sera cassé, de diverses manières souvent difficiles à prédire, lorsqu’il est compilé sur une plate-forme qui ne correspond pas aux hypothèses. Par exemple, sur une plate-forme où int 16 bits, le code ci-dessus laisserait x à une valeur différente de celle prévue par le programmeur.

La plupart du temps, la taille des mots affecte les performances et l’utilisation de la stack. Il est plus rapide de travailler avec n’importe quelle taille de mot pour une architecture donnée. Si vous définissez deux entiers de 32 bits, l’un après l’autre, sur une machine 64 bits, l’un sera sur une limite de mot et l’autre non. Il faut moins de traitement pour placer celui qui se trouve sur la limite du mot dans un registre que celui qui ne se trouve pas sur une limite de mot. D’un autre côté, si vous avez un entier 64 bits défini sur une machine 32 bits, il vous faudra deux extractions pour obtenir les deux mots et des manipulations de registre géniales pour effectuer des opérations sur les entiers. La dernière partie concerne la stack. La stack est toujours composée de mots. Si la taille du mot de la machine est 32 bits, la stack sera une stack de valeurs 32 bits et sur une machine 64 bits, elle aura une valeur de 64 bits. Ce n’est pas que vous vous souciez vraiment de cela, mais un entier de 32 bits sera placé dans un mot de 64 bits sur la stack, et une valeur de 64 bits, à moins que vous ne poussiez un pointeur sur cette valeur. .

Si vous sélectionnez l’alignement des mots dans votre compilateur, il placera automatiquement toutes les variables sur une limite de mot. C’est beaucoup plus rapide, mais prend un peu plus d’espace. À moins que vous ne soyez vraiment pressé par l’espace, vous devriez opter pour la performance. Ce n’est pas une si grande différence sur une architecture de l’ICCA. Sur RISC, cela a fait une énorme différence.

Est ce que ça aide?