Alignement de structure C vs C ++

Dans une récente interview, j’ai été interrogé sur l’alignement des champs de structure C ++ et théorisé que C et C ++ suivaient la même stratégie dans la structure.

Hovewer, c’était la mauvaise hypothèse. L’intervieweur a déclaré qu’en général, C et C ++ sont des structures d’emballage différentes et que nous ne devrions jamais nous attendre au contraire. IMHO c’est une déclaration étrange. Il n’y a pas de qualificatif de pack "C" pour les structures en C ++ pour l’utilisation dans les fichiers d’en-tête C / C ++ bilingues.

Donc, dans la pratique, cela pourrait signifier que vous ne pouvez pas créer une structure en C ++ et la transmettre à une bibliothèque C car en général ses champs seront alignés différemment et auront des décalages différents. Mais, en fait, la plupart des programmeurs s’appuient sérieusement sur cette interopérabilité jusqu’au moment où ils convertissent un pointeur en une structure C POD en une référence à un wrapper C ++ autour de cette structure avec certaines méthodes d’assistance. Pouvez-vous s’il vous plaît clarifier cette question?

Les normes de langage C et C ++ ne requièrent pas de remplissage de structure et en font un détail d’implémentation du compilateur. Une interprétation ssortingcte de ceci signifierait qu’il n’y a aucune garantie qu’une structure serait la même entre les deux.

En pratique, cependant, une version donnée d’une chaîne d’outils capable à la fois de C et de C ++ (comme GCC ou Clang) peut emballer une structure identique de la même manière, si nécessaire. Sans cela, beaucoup de code de production dans le monde ne fonctionneraient tout simplement pas. Ceci est une garantie donnée par la chaîne d’outils, mais pas la langue.

Il convient de noter que si vous deviez déclarer une structure similaire à l’original C, mais que vous avez ajouté des spécificateurs d’access ( private , public et protected ), la disposition changerait, mais c’est un peu exagéré puisque la structure n’est plus identique .

C’était manifestement faux (du côté de l’intervieweur). Il est clair que pour C et C ++, toute personne travaillant avec une API de bas niveau traitant de structs, comme par exemple une API de réseau, a la même structure. Ce sont toutes des fonctions C, qui acceptent les structures «C», mais elles sont appelées des millions de fois par jour à partir du code C ++.

Vous devriez avoir de la chance, vous avez eu cette question. Il est clair que vous ne devriez pas y travailler.

Lorsque C ++ a été développé, les développeurs ont compris que les programmeurs C se fiaient à certaines choses que les développeurs C ++ ne voulaient pas garantir, mais ne pas les garantir signifierait que beaucoup de code C qui était aussi valide du code C ++ serait cassé en code C ++. Pas souhaitable

C’est pourquoi ils ont inventé les structures “POD”: une structure qui n’utilisait aucune fonctionnalité C ++ se comporterait dans un programme C ++ exactement comme dans un programme C (à part le fait que le comportement défini par l’implémentation pourrait changer, car un compilateur C et Un compilateur C ++ n’est clairement pas la même implémentation, alors que le compilateur C ++ devrait simplement copier la définition de l’implémentation à partir du compilateur C).

Si vous prenez n’importe quelle structure C qui est également une structure C ++ valide (pas de membre nommé “class”, par exemple), puis ajoutez simplement “public:” juste après l’accolade, puis sa disposition, l’ordre des membres, l’alignement et ainsi de suite peuvent tous changer. Même si tous les membres de la structure sont publics par défaut, rien n’a vraiment changé. Sauf que à cause du “public:” ce n’est plus un POD.