La Structure d'un Objet C++ dans la Mémoire Vs une Struct
Si j'ai une classe comme suit
class Example_Class
{
private:
int x;
int y;
public:
Example_Class()
{
x = 8;
y = 9;
}
~Example_Class()
{ }
};
Et une structure comme suit
struct
{
int x;
int y;
} example_struct;
Est la structure dans la mémoire de la example_struct
simmilar pour que, dans Example_Class
par exemple, si je ne les suivants
struct example_struct foo_struct;
Example_Class foo_class = Example_Class();
memcpy(&foo_struct, &foo_class, sizeof(foo_struct));
sera foo_struct.x = 8
et foo_struct.y = 9
(ie: les mêmes valeurs que les valeurs x,y dans le foo_class) ?
La raison pour laquelle je demande c'est que j'ai une bibliothèque C++ (ne veux pas le changer) c'est le partage d'un objet avec du code C et je veux utiliser une structure pour représenter l'objet en provenance de la bibliothèque C++. Je suis seulement intéressé par les attributs de l'objet.
Je sais que la situation idéale serait d'avoir Example_class enrouler autour d'une structure commune entre le code C et C++, mais il ne va pas être facile de changer le C++ de la bibliothèque en cours d'utilisation.
- Juste un commentaire mineur, votre constructeur pourrait (et certains disent devrait) être écrit comme ceci: Example_Class() : x(8), y(9) {}
Vous devez vous connecter pour publier un commentaire.
La norme C++ garanties que la mémoire les mises en page d'un C
struct
et C++class
(oustruct
-- même chose) sera identique, à condition que le C++class
/struct
correspond aux critères de POD ("Plain Old Données"). Donc, ce n'est POD veux dire?Une classe ou structure est POD si:
Sur le seul "C++-ismes" autorisées sont non-membre virtuel fonctions membres statiques et les fonctions de membres.
Depuis votre classe a un constructeur et un destructeur, il est formellement parlant, pas de type POD, de sorte que la garantie ne tient pas. (Bien que, comme d'autres l'ont mentionné, dans la pratique, les deux dispositions sont susceptibles d'être identique sur n'importe quel compilateur que vous essayez, tant qu'il n'y a pas de fonctions virtuelles).
Voir la section [de 26,7] de la C++ FAQ Lite pour plus de détails.
Le comportement n'est pas garanti, et le compilateur-dépendante.
Cela dit, la réponse est "oui, sur ma machine", à condition que le Example_Class ne contient pas de méthode virtuelle (et de ne pas hériter d'une classe de base).
Dans le cas que vous décrivez, la réponse est "oui, probablement". Cependant, si la classe possède toutes les fonctions virtuelles (y compris destructeur virtuel, qui peut être hérité d'une classe de base), ou à l'utilisation de l'héritage multiple, puis la classe de mise en page peut être différente.
À ajouter à ce que d'autres personnes ont dit (par exemple: un compilateur spécifique, sera probablement travailler aussi longtemps que vous n'avez pas de fonctions virtuelles):
Je vous suggère fortement d'une statique assert (au moment de la compilation à vérifier) que la sizeof(Example_class) == sizeof(example_struct) si vous faites cela. Voir BOOST_STATIC_ASSERT, ou l'équivalent compilateur spécifique ou de construction sur mesure. C'est une bonne première ligne de défense, si quelqu'un (ou quelque chose, comme un compilateur changement) modifie la classe d'invalider le match. Si vous souhaitez plus de la vérification, vous pouvez aussi le moment de l'exécution que les décalages pour les membres sont les mêmes, le (avec la statique de la taille de l'affirmer) permet de garantir l'exactitude.
Dans les premiers jours de compilateurs C++ il y avait des exemples quand compilateur premier changement de structure avec les mots-clés de classe et les compile. Donc, beaucoup de similitudes.
Différences proviennent de l'héritage de classe et, en particulier, des fonctions virtuelles. Si la classe contient des fonctions virtuelles, alors il doit avoir un pointeur vers un descripteur de type au début de sa mise en page. Aussi, si la classe B hérite de la classe A, la classe A de la mise en page vient en premier, suivie par la classe B est propre mise en page.
Donc, la réponse précise à votre question à propos de simplement jeter une instance de classe à une structure instance est: dépend de la classe de contenu. Pour la classe particulière qui a des méthodes (constructeur et non destructeur virtuel), la mise en page est probablement va être le même. Si le destructeur de l'être déclarée virtuelle, la mise en page serait certainement différente entre la structure et la classe.
Voici un article qui montre qu'il n'y a pas beaucoup à faire à l'étape de la C structures de classes C++: Leçon 1 - à Partir de la Structure de Classe
Et voici l'article qui explique comment le virtuel tableau de fonctions est introduit pour les classes qui ont des fonctions virtuelles: Leçon 4 - Le Polymorphisme
Classes & struct en C++ sont l'équivalent, sauf que tous les membres d'une struct sont publics par défaut (les membres de la classe sont privées par défaut). Cela garantit que l'héritage de la compilation du code C dans un compilateur C++ fonctionne comme prévu.
Il n'y a rien qui vous empêche d'utiliser toute la fantaisie des fonctionnalités C++ dans une struct:
Pourquoi ne pas attribuer de façon explicite de la classe des membres de la structure lorsque vous souhaitez transmettre les données à C? De cette façon, vous savez que votre code fonctionne n'importe où.
Vous avez probablement juste de dériver la classe de la structure, que ce soit en public ou en privé. Ensuite, casting il permettrait de résoudre correctement dans le code C++.