Maison >développement back-end >C++ >Memcpy construit-il implicitement des objets en C ?

Memcpy construit-il implicitement des objets en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-10 17:51:02925parcourir

Does memcpy Implicitly Construct Objects in C  ?

Création implicite d'objets en C : un cas délicat de "construction"

En C , le comportement de la copie mémoire (memcpy) lorsqu'elle est utilisée avec des types trivialement copiables peut soulever des questions sur le cycle de vie des objets. L'extrait de code suivant illustre l'ambiguïté :

#include <cstdlib>
#include <cstring>

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);

    return 0;
}

La question clé est de savoir si le segment de code commençant par T *b = static_cast crée un objet dont la durée de vie a commencé. Les normes C manquent de clarté sur cette question, la qualifiant de non spécifiée.

N3751, un article suggérant que memcpy soit reconnu comme une opération de construction d'objets, n'a pas encore été accepté dans la norme. Le projet de norme actuel mentionne la création d'objets à travers des définitions, de nouvelles expressions ou des besoins de mise en œuvre, mais ne traite pas explicitement des copies réalisées à l'aide de memcpy.

La proposition p0593 vise à lever cette ambiguïté en introduisant le concept de création d'objet implicite. pour la manipulation de la mémoire de bas niveau. Il propose que memcpy et les opérations similaires créent implicitement des objets dans le stockage nouvellement alloué. Cela fournirait un comportement bien défini pour l'extrait de code présenté.

Cependant, il est important de noter que p0593 n'a pas encore été examiné ou accepté. Par conséquent, le comportement de memcpy lorsqu'il est utilisé avec des types trivialement copiables reste non spécifié dans la norme C.

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