std::launder
उपयुक्त नाम है, हालांकि केवल अगर आप जानते हैं कि यह किस लिए है। यह मेमोरी लॉन्ड्रिंग करता है ।
कागज में उदाहरण पर विचार करें:
struct X { const int n; };
union U { X x; float f; };
...
U u = {{ 1 }};
यह कथन कुल मिलाकर प्रारंभिक प्रदर्शन करता है, के U
साथ पहले सदस्य को आरंभ करता है {1}
।
क्योंकि n
एक है const
चर, संकलक ग्रहण करने के लिए है कि नि: शुल्क है u.x.n
जाएगा हमेशा 1 हो।
यदि हम ऐसा करते हैं तो क्या होता है:
X *p = new (&u.x) X {2};
क्योंकि X
तुच्छ है, हमें इसकी जगह एक नया बनाने से पहले पुरानी वस्तु को नष्ट करने की आवश्यकता नहीं है, इसलिए यह पूरी तरह से कानूनी कोड है। नई वस्तु का n
सदस्य 2 होगा।
तो बताओ ... क्या u.x.n
लौटाएगा?
स्पष्ट उत्तर 2 होगा। लेकिन यह गलत है, क्योंकि संकलक को यह मानने की अनुमति है कि वास्तव में const
चर (न कि केवल एक const&
, लेकिन घोषित वस्तु चर const
) कभी नहीं बदलेगा । लेकिन हमने इसे बदल दिया।
[basic.life] / 8 उन परिस्थितियों को बाहर निकालता है जब पुराने बनाए गए चर / बिंदुओं / संदर्भों के माध्यम से नव निर्मित वस्तु तक पहुंचना ठीक होता है। और const
सदस्य होना अयोग्य कारकों में से एक है।
तो ... हम कैसे u.x.n
ठीक से बात कर सकते हैं ?
हमें अपनी याददाश्त बढ़ानी होगी:
assert(*std::launder(&u.x.n) == 2); //Will be true.
मनी लॉन्ड्रिंग का उपयोग लोगों को ट्रेस करने से रोकने के लिए किया जाता है जहां आपको अपना पैसा मिला था। मेमोरी लॉन्ड्रिंग का उपयोग कंपाइलर को ट्रेसिंग से रोकने के लिए किया जाता है जहां आपको अपनी वस्तु मिली थी, इस प्रकार इसे किसी भी अनुकूलन से बचने के लिए मजबूर करना जो अब लागू नहीं हो सकता है।
अयोग्य कारकों में से एक है यदि आप ऑब्जेक्ट के प्रकार को बदलते हैं। std::launder
यहाँ भी मदद कर सकते हैं:
aligned_storage<sizeof(int), alignof(int)>::type data;
new(&data) int;
int *p = std::launder(reinterpret_cast<int*>(&data));
[basic.life] / 8 हमें बताता है कि, यदि आप पुराने के भंडारण में एक नई वस्तु आवंटित करते हैं, तो आप पुराने के लिए पॉइंटर्स के माध्यम से नई वस्तु तक नहीं पहुँच सकते। launder
हमें उस ओर कदम बढ़ाने की अनुमति देता है।
std::launder
?std::launder
इसका उपयोग "एक ऑब्जेक्ट के लिए एक पॉइंटर को प्राप्त करने के लिए किया जाता है, जो एक ही प्रकार के मौजूदा ऑब्जेक्ट द्वारा कब्जा किए गए स्टोरेज में बनाया गया है, भले ही इसमें कॉन्स्टेंट या संदर्भ सदस्य हों।"