disposition de la mémoire des objets en C++
Je suis fondamentalement, vous demandez-vous comment C++ définit l'objet en mémoire. Donc, j'ai entendu dire que dynamique jette tout simplement d'ajuster l'objet du pointeur dans la mémoire avec un décalage; et de les réinterpréter sorte de nous permet de faire quelque chose avec ce pointeur. Je ne comprends pas vraiment ce. Détails serait appréciée!
Vous devez vous connecter pour publier un commentaire.
Chaque classe dispose de ses données membres dans l'ordre de déclaration.
Le compilateur est permis de placer un rembourrage entre les membres afin de rendre l'accès efficace (mais il n'est pas autorisé à re-commande).
Comment
dynamic_cast<>
œuvres est un compilateur de mise en œuvre détail et n'est pas définie par la norme. Tout dépendra de l'ABI utilisé par le compilateur.reinterpret_cast<>
fonctionne juste en changeant le type de l'objet. La seule chose que vous pouvez garantir que les œuvres est que la conversion d'un pointeur de type void* et, à la même le pointeur de classe de vous donner le même pointeur.public:
,private:
, etprotected:
dans une classe. J'ai trouvé cet article: embedded.com/design/218600150?pgno=1 extrêmement utile, et c'est là que j'ai appris ce que Richard a mentionné dans son commentaire. J'ai regardé le C++ standard lié là, et sur pg. 198 (sec. 9.2 article 12), il déclare: "L'ordre de la répartition des non-membres de données statiques avec différents contrôle d'accès n'est spécifié"Disposition de la mémoire est le plus souvent laissée à la mise en œuvre. La clé d'exception est que les variables de membre pour un accès rédacteur de devis sera dans l'ordre de leur déclaration.
§ 9.2.14
Autres que les variables de membre, une classe ou structure doit fournir de l'espace pour les variables de membre, les sous-objets de classes de base virtuelles fonction de gestion (par exemple, une table virtuelle), et de l'espacement et l'alignement de ces données. C'est jusqu'à la mise en œuvre, mais l'Itanium ABI spécification est un choix populaire. gcc et clang y adhérer (au moins à un certain degré).
http://mentorembedded.github.io/cxx-abi/abi.html#layout
L'Itanium ABI est bien sûr pas partie de la norme C++ et n'est pas contraignante. Pour obtenir plus de détails vous devez vous tourner votre réalisateur de la documentation et des outils. clang fournit un outil pour afficher la disposition de la mémoire de classes. Par exemple, les suivantes:
Après la création d'un fichier source qui utilise la disposition de la mémoire de la classe, clang va révéler la disposition de la mémoire.
La mise en page pour
Class
:Plus sur ce bruit caractéristique peut être trouvé sur Eli Bendersky du blog:
http://eli.thegreenplace.net/2012/12/17/dumping-a-c-objects-memory-layout-with-clang/
gcc fournit un outil similaire, `-fdump-classe-hiérarchie". Pour la classe ci-dessus, il imprime (entre autres choses):
Il n'a pas repris une à une les variables de membre (ou, au moins, je ne sais pas comment le faire), mais vous pouvez dire qu'il faudrait décalage entre 28 et 64, tout comme dans le cliquetis de mise en page.
Vous pouvez voir qu'une classe de base est désignée comme
primary
. Cela supprime la nécessité de l'ajustement de lathis
pointeur lorsqueClass
est consulté en tant queSBase1
.L'équivalent pour gcc:
L'équivalent pour Visual C++ est:
voir: https://blogs.msdn.microsoft.com/vcblog/2007/05/17/diagnosing-hidden-odr-violations-in-visual-c-and-fixing-lnk2022/
La réponse est, "c'est compliqué". Dynamique de la fonte ne se contente pas de régler des pointeurs avec un décalage; il peut effectivement récupérer des pointeurs internes à l'intérieur de l'objet afin de faire son travail. GCC suit un ABI conçu pour Itanium, mais une mise en œuvre plus large. Vous pouvez trouver les détails techniques ici: Itanium ABI C++ .
Comme indiqué précédemment, tous les détails sont compliquées, pénible à lire, et vraiment utile que pour les développeurs de compilateurs, et varie selon les compilateurs. Fondamentalement, chaque objet contient les éléments suivants (généralement disposés dans cet ordre):
Ces éléments de données peuvent ou peuvent ne pas être rembourré pour faire de la mémoire de l'alignement plus facile etc. Caché dans le runtime type d'informations est des trucs sur le type, la v-tableaux virtuel pour les parents des classes, etc, tout ce qui est compilateur spécifique.
Quand il s'agit de moulages,
reinterpret_cast
change simplement le C++ type de données de la flèche et ne fait rien d'autre, alors vous feriez mieux d'être sûr que vous savez ce que vous faites quand vous l'utilisez, sinon, vous êtes responsable de gâcher les choses mal.dynamic_cast
n'très près la même chose qu'static_cast (dans la modification du pointeur) sauf qu'il utilise le moteur d'exécution type d'informations afin de déterminer si elle peut se convertir en un type donné, et comment le faire. Encore une fois, tout ce qui est compilateur spécifique. Notez que vous ne pouvez pasdynamic_cast
unvoid*
parce qu'il a besoin de savoir où trouver de l'exécution des informations de type, donc il peut faire tous ses merveilleux exécution des contrôles.cette question est déjà répondu à
http://dieharddeveloper.blogspot.in/2013/07/c-memory-layout-and-process-image.html
voici un extrait à partir de là:
Dans le milieu de l'espace d'adressage du processus, il y a une région qui est réservé aux objets partagés. Lorsqu'un nouveau processus est créé, le gestionnaire de processus premières cartes les deux segments à partir de l'exécutable en mémoire. Il décode le programme de l'en-tête ELF. Si le programme de l'en-tête indique que le fichier exécutable a été liée à l'encontre d'une bibliothèque partagée, le gestionnaire de processus (PM) va extraire le nom de la dynamique de l'interprète de l'en-tête du programme. La dynamique interprète points à une bibliothèque partagée qui contient le moteur d'exécution de l'éditeur de liens code.