Maison > développement back-end > C++ > Quand « reinterpret_cast » crée-t-il des objets en C et quelles sont les implications pour la durée de vie des objets ?

Quand « reinterpret_cast » crée-t-il des objets en C et quelles sont les implications pour la durée de vie des objets ?

Patricia Arquette
Libérer: 2024-12-08 13:55:11
original
696 Les gens l'ont consulté

When Does `reinterpret_cast` Create Objects in C   and What are the Implications for Object Lifetime?

Reinterpret_cast et création d'un constructeur par défaut

En C , certains objets peuvent être facilement créés à l'aide de reinterpret_cast sur une mémoire correctement alignée. Cependant, le comportement et les implications de telles opérations nécessitent des éclaircissements.

La déclaration originale cppreference suggère que des objets avec des constructeurs par défaut triviaux peuvent être créés à l'aide de reinterpret_cast, ce qui implique que le code suivant est valide :

struct X { int x; };
alignas(X) char buffer[sizeof(X)];
reinterpret_cast<X*>(buffer)->x = 42;
Copier après la connexion

Cependant, une formulation plus récente de l'instruction cppreference souligne que les objets ne peuvent pas être simplement créés en réinterprétant le stockage, et que le placement-new est nécessaire pour éviter un comportement indéfini. Cela soulève plusieurs questions :

  1. La déclaration initiale est-elle incorrecte ?
  2. Si elle est correcte, quand commence la durée de vie de l'objet X et le casting lui-même constitue-t-il une acquisition de stockage ?
  3. Y a-t-il des changements à cet égard entre C 11 et C 1z ?

Exactité de la déclaration initiale

La déclaration mise à jour sur cppreference est exacte. Contrairement au C, les objets ne peuvent pas être créés en C en réinterprétant simplement une mémoire appropriée. Selon la norme du langage, un objet est créé via des mécanismes explicites tels que des définitions, de nouvelles expressions ou lors d'un changement implicite du membre actif d'un syndicat.

Dans l'extrait de code donné, aucune création d'objet n'a lieu. Bien que la mémoire soit allouée pour un objet X potentiel, aucun objet n'est formellement introduit dans le code. Prétendre qu'un objet X existe sur la base de cette mémoire entraîne un comportement indéfini.

Acquisition de la durée de vie et du stockage

Le placement du spécificateur alignas avant la déclaration du tampon garantit un alignement correct pour un objet X. Cependant, l'allocation de mémoire n'initie pas la durée de vie d'un objet.

alignas(X) char buffer[sizeof(X)]; // (A)
Copier après la connexion

De même, le reinterpret_cast n'acquiert pas non plus de stockage pour l'objet X.

reinterpret_cast<X*>(buffer)->x = 42; // (B)
Copier après la connexion

Étant donné qu'aucun objet est créé, il n'y a pas de durée de vie à prendre en compte et le casting n'est pas considéré comme une acquisition de stockage.

Changements de C 11 à C 1z

L'interprétation du texte cité reste la même entre C 11 et C 1z. En C 11, le paragraphe principal concernant la création d'objets est similaire à celui introduit en C 1z. Bien que ce paragraphe particulier soit désormais considéré comme la définition de « objet » en C 1z, son interprétation ne change pas.

L'instruction originale cppreference impliquant la création d'objets via reinterpret_cast pourrait potentiellement conduire à des idées fausses et à des malentendus sur les règles de création d'objets en C . Le libellé mis à jour reflète fidèlement la véritable nature de cette opération et s'aligne sur la norme du langage, qui définit explicitement quand un objet est créé et comment commence sa durée de vie.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal