Préoccupations lors de l'utilisation de "memcpy" pour construire des objets trivialement copiables
En C, la validité de l'utilisation de "memcpy" pour construire des objets de manière triviale les types copiables ont fait l’objet de débats. Cet article explore les nuances et les incertitudes entourant ce code :
#include <cstdlib> #include <cstring> struct T // trivially copyable type { 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); }
Durée de vie incertaine des objets avec "memcpy""
Le nœud de la question réside dans la détermination si " *b" représente un objet dont la durée de vie a été initiée et, si c'est le cas, quand cette durée de vie commence. Le standard C reste silencieux sur cette question.
Proposition de création implicite d'objet et état actuel
Pour lever cette ambiguïté, la proposition p0593 a été avancée, préconisant la création implicite d'objets lors d'opérations de manipulation d'objets de bas niveau telles que "malloc" et "memcpy". Ce changement proposé fournirait un comportement défini pour de tels scénarios. Cependant, cette proposition n'a pas encore été officiellement examinée.
Directives du projet de norme C 14
Conformément au projet de norme C 14, section 1.8 [intro.object] , les objets sont principalement créés via des définitions, de nouvelles expressions ou certains processus d'implémentation. La section 3.9 [basic.types] relative aux types trivialement copiables spécifie que la copie des octets de ces objets est autorisée, à condition que les valeurs soient restaurées de manière appropriée.
Discussion en cours et approches alternatives
La « liste de diffusion ub » a facilité une discussion animée sur ce sujet, en se concentrant sur la nécessité d'éviter la copie via le jeu de mots.
Conclusion
La question de la "construction" d'objets trivialement copiables avec "memcpy" reste non résolue au sein du standard C, laissant place à un comportement potentiel indéfini. Les discussions et propositions en cours, telles que p0593, visent à clarifier et à résoudre ce problème, apportant une plus grande certitude à la manipulation d'objets de bas niveau en 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!