Maison  >  Article  >  développement back-end  >  Memcpy construit-il des objets trivialement copiables en C ?

Memcpy construit-il des objets trivialement copiables en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-08 15:11:02986parcourir

Does memcpy Construct Trivially Copyable Objects in C  ?

Dévoilement de la compatibilité de la « construction » d'objets trivialement copiables avec memcpy

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!

Déclaration:
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