Maison >développement back-end >C++ >Comment `std::launder` de C résout-il les problèmes d'alias de mémoire et de durée de vie ?
Blanchiment de mémoire : l'introduction de std::launder en C
P0137 introduit std::launder pour résoudre certains problèmes liés aux syndicats, durée de vie et pointeurs en C . Ce modèle de fonction permet le blanchiment de mémoire, un processus qui empêche le compilateur de faire des hypothèses sur le contenu modifié de la mémoire.
Blanchiment de mémoire
std::launder effectue la mémoire le blanchiment, qui supprime toutes les hypothèses que le compilateur a pu faire sur le contenu d'un emplacement mémoire. Ceci est particulièrement pertinent lorsque :
Exemple : Blanchir une Union const Champ
Considérez cet exemple :
struct X { const int n; }; union U { X x; float f; }; U u = {{ 1 }}; X *p = new (&u.x) X {2};
L'initialisation de u.x avec {1} suppose que le membre const n sera toujours 1. Cependant, l'attribution de p à un nouvel objet X avec n fixé à 2 viole cette hypothèse.
Pour accéder correctement à u.x.n après cette modification, il faut blanchir le memory:
assert(*std::launder(&u.x.n) == 2); // Will be true
Autres applications
std::launder peut également être utilisé dans des situations où les durées de vie sont potentiellement violées, comme lors de l'attribution d'un nouvel objet dans le stockage d'un ancien objet sans utiliser le placement nouveau :
alignas(int) char data[sizeof(int)]; new(&data) int; int *p = std::launder(reinterpret_cast<int*>(&data));
En blanchissant le pointeur, nous contournons les règles de durée de vie qui empêcheraient autrement accéder au nouvel objet.
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!