Dans le domaine de la programmation C, la construction d'objets trivialement copiables à l'aide de méthodes de copie au niveau du bit comme memcpy a a déclenché un débat sur la durée de vie des objets. La question se pose : L'objet pointé par b dans le code suivant est-il garanti d'avoir une durée de vie bien définie ?
struct T { int x, y; }; int main() { void *buf = std::malloc(sizeof(T)); if (!buf) return 0; T a{}; std::memcpy(buf, &a, sizeof a); T *b = static_cast<T *>(buf); b->x = b->y; free(buf); }
Le problème non résolu
Le C La norme reste ambiguë sur ce sujet, malgré les discussions et propositions en cours. Le manque de directives claires a laissé cette question sans réponse, avec des implications pour les outils d'analyse sémantique, les optimiseurs et le suivi de la durée de vie.
Proposition N3751
N3751 suggère de reconnaître memcpy opérations impliquant des objets copiables triviaux distincts en tant que construction d'objets, prenant en charge les E/S binaires tout en préservant l'analyse de la durée de vie capacités.
Norme C 14
La norme C 14 définit la création d'objets comme se produisant via des définitions, une nouvelle expression ou lorsque l'implémentation le juge nécessaire. Le langage actuel n'aborde pas explicitement l'utilisation de memcpy pour construire des objets.
Implémentation de std::vector
L'implémentation actuelle de std::vector met en évidence un scénario pratique où ce problème se pose, conduisant à un comportement indéfini.
Proposition p0593 : Objet implicite Création
La proposition p0593 vise à lever cette ambiguïté en définissant explicitement des scénarios dans lesquels des objets sont implicitement créés, y compris des appels à malloc et memcpy. Il propose des mécanismes pour créer des objets à la demande, donnant aux programmes un comportement défini. Cependant, cette proposition reste à l'étude.
Conclusion
Le statut de la construction d'objets à l'aide de memcpy reste un sujet de débat en cours dans la communauté C. Jusqu'à ce qu'un consensus soit atteint et que la norme soit mise à jour, le comportement du code comme dans l'exemple fourni reste indéfini, conduisant potentiellement à un comportement imprévisible du programme.
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!