सी ++ में, अधिकांश अनुकूलन एएस-नियम से प्राप्त किए गए हैं। यही है, जब तक कार्यक्रम व्यवहार नहीं करता है-यदि कोई अनुकूलन नहीं हुआ है, तो वे मान्य हैं।खाली डेटा सदस्य अनुकूलन: क्या यह संभव होगा?
खाली बेस अनुकूलन एक ऐसी चाल है: कुछ स्थितियों में, यदि बेस क्लास खाली है (कोई गैर-स्थैतिक डेटा सदस्य नहीं है), तो संकलक इसकी स्मृति प्रस्तुति को बढ़ा सकता है।
जाहिर है ऐसा लगता है कि मानक डेटा के सदस्यों पर इस अनुकूलन की मनाही है, कि भले ही एक डेटा सदस्य खाली है, यह अभी भी जगह कम से कम एक बाइट लायक ले लेना चाहिए: n3225 से, [वर्ग]
4 - कक्षा के प्रकार के पूर्ण ऑब्जेक्ट्स और सदस्य उप-प्रोजेक्ट में nonzero आकार होगा।
नोट: इस EBO में लात जब उचित
मैं अगर सोच रहा था की है करने के लिए नीति डिजाइन के लिए निजी वंशानुक्रम के उपयोग की ओर जाता है, का उपयोग कर के रूप में करता है, तो नियम है, एक अभी भी हो सकता है इस अनुकूलन करने में सक्षम है।
संपादित: जवाब और टिप्पणियों के एक नंबर के बाद, और यह स्पष्ट है कि मैं क्या कर रहा हूँ के बारे में सोच सकते हैं।
सबसे पहले, मुझे एक उदाहरण देता है:
struct Empty {};
struct Foo { Empty e; int i; };
मेरा प्रश्न है, क्यों sizeof(Foo) != sizeof(int)
है? विशेष रूप से, जब तक कि आप कुछ पैकिंग निर्दिष्ट नहीं करते हैं, संभावनाएं संरेखण के मुद्दों के कारण होती हैं कि फू int के आकार से दोगुना होगा, जो हास्यास्पद रूप से फुलाया जाता है।
नोट: मेरे सवाल क्यों sizeof(Foo) != 0
है, ऐसा इसलिए है क्योंकि कोई उप-वस्तु एक शून्य आकार हो सकता है नहीं है यह वास्तव में सी ++ के अनुसार EBO या तो
वजह से नहीं है।
struct Bar: Empty { int i; };
की संभावना है (EBO करने के लिए धन्यवाद) sizeof(Bar) == sizeof(int)
पालन करने के लिए: हालांकि एक आधार एक शून्य आकार (EBO) इसलिए है करने के लिए अधिकृत है।
स्टीव जेसॉप एक राय का मानना है कि ऐसा नहीं है कि कोई भी दो उप-वस्तुओं का एक ही पता नहीं होगा। मैं इसके बारे में सोचा, लेकिन यह वास्तव में ज्यादातर मामलों में अनुकूलन नहीं रोकता:
यदि आपके पास "अप्रयुक्त" स्मृति, तो यह मामूली बात है:
struct UnusedPadding { Empty e; Empty f; double d; int i; };
// chances are that the layout will leave some memory after int
लेकिन वास्तव में, यह और भी "बदतर है "इसके मुकाबले, क्योंकि Empty
अंतरिक्ष कभी नहीं लिखा गया है (यदि बेहतर होगा कि ईबीओ इसमें शामिल न हो तो बेहतर होगा ...) और इसलिए आप वास्तव में है कि किसी अन्य वस्तु का पता नहीं है एक कब्जे वाले जगह पर यह जगह सकता है:
struct Virtual { virtual ~Virtual() {} Empty e; Empty f; int i; };
// most compilers will reserve some space for a virtual pointer!
या, यहां तक कि हमारे मूल मामले में:
struct Foo { Empty e; int i; }; // deja vu!
एक अगर सब हम (char*)foo.e == (char*)foo.i + 1
हो सकता था चाहता था अलग पता था।
बूस्ट के [संपीडित जोड़ी] (http://www.boost.org/doc/libs/1_45_0/libs/utility/compressed_pair.htm) पुस्तकालय पर एक नजर डालें, कैसे इस अनुकूलन प्राप्त करने के लिए देखने के लिए। – GManNickG
@GMan: वे चालाकी से ईबीओ का उपयोग करते हैं। लेकिन असल में ईबीओ का यह उपयोग ठीक है जो मेरे प्रश्न को शुरू करने के लिए प्रेरित करता है। –
इसे देखें: [प्रोग्रामर खाली बेस ऑप्टिमाइज़ेशन (ईबीओ) का उपयोग कब करते हैं] (http://stackoverflow.com/questions/4325144/scenario-when-do-programmers-use-empty-base-optimization-ebo) – Nawaz