निम्नलिखित तीन struct
एस पर विचार करें :
class blub {
int i;
char c;
blub(const blub&) {}
};
class blob {
char s;
blob(const blob&) {}
};
struct bla {
blub b0;
blob b1;
};
विशिष्ट प्लेटफार्मों पर जहां int
4 बाइट्स हैं, आकार, संरेखण और कुल पैडिंग 1 इस प्रकार हैं:
struct size alignment padding
-------- ------ ----------- ---------
blub 8 4 3
blob 1 1 0
bla 12 4 6
के भंडारण blub
और blob
सदस्यों के बीच कोई ओवरलैप नहीं है , भले ही आकार 1 के blob
सिद्धांत में "फिट" हो सकता है blub
।
C ++ 20 उस no_unique_address
विशेषता का परिचय देता है, जो आसन्न खाली सदस्यों को समान पता साझा करने की अनुमति देता है। यह स्पष्ट रूप से एक सदस्य की गद्दी का उपयोग करके ऊपर वर्णित परिदृश्य को दूसरे को संग्रहीत करने की अनुमति देता है। से cppreference (जोर मेरा):
इंगित करता है कि इस डेटा सदस्य को अपने वर्ग के अन्य सभी गैर-स्थैतिक डेटा सदस्यों से अलग एक पता नहीं होना चाहिए। इसका मतलब यह है कि यदि सदस्य के पास एक खाली प्रकार (जैसे स्टेटलेस एलोकेटर) है, तो संकलक इसे बिना किसी स्थान पर कब्जा करने के लिए अनुकूलित कर सकता है, जैसे कि यह एक खाली आधार था। यदि सदस्य खाली नहीं है, तो अन्य डेटा सदस्यों को संग्रहीत करने के लिए उसमें किसी भी टेल पैडिंग का पुन: उपयोग किया जा सकता है।
वास्तव में, यदि हम इस विशेषता का उपयोग करते हैं, तो blub b0
इसका आकार घटbla
जाता है 8
, इसलिए blob
इसे वास्तव में blub
गॉडबोल्ट के अनुसार देखा जाता है ।
अंत में, हम अपने सवाल पर आते हैं:
मानकों में क्या पाठ (C ++ 20 के माध्यम से C ++ 11) इस ओवरलैपिंग को बिना no_unique_address
उन वस्तुओं के लिए रोकता है , जो तुच्छ रूप से कॉपी करने योग्य नहीं हैं?
मुझे ऊपर से तुच्छ रूप से कॉपी करने योग्य (टीसी) ऑब्जेक्ट्स को बाहर करने की आवश्यकता है, क्योंकि टीसी ऑब्जेक्ट्स के लिए, यह std::memcpy
एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट में शामिल है, जिसमें सदस्य सबोबिज भी शामिल हैं, और अगर स्टोरेज ओवरलैप किया गया था, तो यह टूट जाएगा (क्योंकि सभी या स्टोरेज का हिस्सा आसन्न सदस्य के लिए अधिलेखित किया जाएगा) 2 ।
1 हम पैडिंग की गणना केवल संरचना के आकार और उसके सभी घटक सदस्यों के आकार के बीच अंतर के रूप में करते हैं।
2 यही कारण है कि मेरे पास कॉपी कंस्ट्रक्टर्स परिभाषित हैं: बनाने blub
और तुच्छ रूप से कॉपी करने के लिए blob
नहीं ।