62 votes

C vs C++ struct alignement

J'ai été invité dans une récente interview à propos de C++ struct champs d'alignement et theoretized que le C et le C++ suit la même stratégie dans la structure de l'emballage.

Hovewer, c'était une hypothèse erronée. L'enquêteur a dit qu'en général, le C et le C++ sont emballage des structures de différentes manières et il ne faut jamais s'attendre à l'inverse. À mon humble avis, c'est étrange déclaration. Il n'y a pas d' pack "C" qualificatif pour les structures en C++ pour l'utilisation dans les bilingues C/C++ fichiers d'en-tête.

Donc, dans la pratique, cela pourrait signifier que vous ne pouvez pas créer un struct en C++ et le transmettre à une bibliothèque C parce qu'en général, ses champs seront alignés d'une manière différente et ont des positions différentes. Mais, en fait, la plupart des programmeurs sérieusement compter sur cette interopérabilité, jusqu'au moment où ils permettent de convertir un pointeur vers un C POD struct à une référence à wrapper C++ autour de cette structure avec certaines méthodes d'aide. Pouvez-vous préciser cette question?

68voto

Sam Cristall Points 3193

Le C et C++ langage normes font pas d'exigences de struct rembourrage et de la laisser à un compilateur de détail d'implémentation. Une interprétation stricte de cette signifierait qu'il n'y a aucune garantie d'un struct serait la même entre les deux.

Dans la pratique, cependant, une version donnée d'un ensemble d'outils capables de C et de C++ (comme GCC ou Clang) peut pack identique d'un struct dans la même manière, si nécessaire. Sans cela, beaucoup de code de production dans le monde ne serait tout simplement pas de travail. C'est une garantie donnée par l'ensemble des outils, cependant, et pas la langue.

Il est intéressant de noter que si vous étiez à déclarer une semblable structure de la C d'origine, mais il a ajouté spécificateurs d'accès (private, public et protected), que la mise en page devrait changer, mais c'est un peu exagéré, puisque la structure n'est plus identique.

29voto

SergeyA Points 2159

Ce fut la plus évidemment faux (l'interviewer). Il est clair de voir que la structure de l'emballage est le même pour le C et le C++ pour quelqu'un qui a travaillé avec n'importe quel bas niveau de l'API de traiter avec les structures - par exemple, un réseau API. Tous ceux qui sont des fonctions C, qui acceptent le 'C' les structures, pourtant, ils sont en sécurité appelé millions de millions de fois en une seule journée, à partir de code C++.

Vous devez avoir de la chance vous avez eu cette question. Il indique clairement que vous ne devrait pas y travailler.

4voto

gnasher729 Points 5011

Quand le C++ a été développé, les développeurs ont compris que les programmeurs C invoqué certaines des choses que les développeurs C++ ne voulais pas de garantie, mais ne garantissant pas leur signifierait que beaucoup de code C qui est également valable code C++ serait brisé lorsqu'il est utilisé comme code C++. Pas souhaitable.

C'est pourquoi ils ont inventé "POD" structures: Une structure qui n'utilise pas toutes les fonctionnalités C++ serait se comporter dans un programme C++, comme il le ferait dans un programme C (en dehors du fait que la mise en œuvre définies comportement pourrait changer, depuis un compilateur C et un compilateur C++ sont clairement pas la même mise en œuvre. D'autre part, le compilateur C++ serait probablement juste de copier la mise en œuvre définition du compilateur C).

Si vous prenez toute la plaine de structure C qui est aussi valable en C++ struct (pas de membres, nommée "classe", par exemple), et puis il suffit d'ajouter "public:" juste après l'accolade d'ouverture, puis sa disposition, afin de les membres, de l'alignement et ainsi de suite peut changer du tout au tout. Même si tous les membres de la structure sont par défaut public, de sorte que rien n'a vraiment changé. Sauf que, parce que le "public:" ce n'est pas un POD de plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X