La question est la suivante: le langage de programmation C définit-il comment les exécutables produits par les compilateurs doivent être formatés en termes de types de taille de données? Pour mieux expliquer cela, supposons que je compile un fichier de code source C contenant une variable de type int appelée «x». J'ai réussi à compiler le code source dans un exécutable et à l'exécuter. Pendant l'exécution, l'emplacement mémoire alloué pour «x» est large de 4 octets et structuré selon la norme de complément à 2.

Si je devais exécuter le même exécutable compilé à partir d'une machine différente avec le même système d'exploitation et un processeur compatible, ai-je la garantie que la variable aura à tout moment une largeur de 4 octets dans le même format exact (ce qui signifie exactement le même bit empreinte)? Je sais que C a des tailles de données variables pour les types élémentaires et que cela ne s'applique qu'au code pré-compilé. Mais qu'en est-il du code post-compilé? Si int se traduit par un type de données assembleur DWORD sur une machine qui lui alloue 32 bits, y a-t-il une garantie qu'il prendra la forme de 32 bits sur une autre? DWORD est-il toujours le même sur différents processeurs du même modèle?

J'ai toujours supposé que la compilation était juste le processus d'établissement de tous les détails d'implémentation et de «fixer dans la pierre» la taille exacte et les formats internes des types de données en mémoire, mais j'aimerais avoir une confirmation. Cela s'applique-t-il également au C ++?

-1
Alex 15 août 2017 à 01:57

2 réponses

Meilleure réponse

Au-dessous du niveau C, les compilateurs respectent également une certaine «interface binaire d'application» (ABI abrégé; ne pas se tromper avec l'API). C'est ce qui définit ces détails dans la pierre. L'interface binaire de l'application définit la taille des types et la représentation des entiers, parmi un lot d'autres choses, comme la façon dont les paramètres sont passés aux fonctions.

Une seule plate-forme peut prendre en charge plusieurs ABI. Par exemple, sous Windows, vous avez l'ABI natif et vous pouvez installer Cygwin, qui vous permet d'exécuter des programmes avec une ABI plus proche de celle de Linux. Cependant, en supposant que deux machines différentes prennent en charge le même ABI, alors oui, le partage d'exécutables entre eux est garanti de fonctionner (en supposant que les bibliothèques requises et autres sont présentes) et tout est garanti pour avoir une représentation compatible.

C'est la même chose en principe pour C ++.

2
zneak 14 août 2017 à 23:34

Si je devais exécuter le même exécutable compilé à partir d'une machine différente avec le même système d'exploitation et un processeur compatible, ai-je une garantie que la variable aura à tout moment une largeur de 4 octets dans le même format exact

La norme C ne le garantit pas, mais ce sera le cas. Cela sera déterminé par le code machine compilé.

1
user2100815user2100815 14 août 2017 à 23:04