सी ++ शून्य आकार की एक वस्तु की अनुमति नहीं है, क्योंकि हर वस्तु एक अनूठा स्मृति पता होना चाहिए। तो यदि आपके पास है:
struct empty {};
// ...
empty myempty;
empty* ptr = &myempty;
तो ptr
एक अद्वितीय स्मृति पते पर इंगित करना चाहिए। मानक इस उद्देश्य के लिए किसी वस्तु के लिए न्यूनतम आकार 1 बाइट है। इसी प्रकार, आकार 0 के आवंटन की अनुमति है, और एक मान्य सूचक लौटने के लिए, भले ही उस सूचक के लिए लिख अनुमति नहीं है (इस malloc(0)
के लिए काम करता है, और new empty
एक बाइट के लिए सूचक देता है, sizeof(empty) == 1
के बाद से)।
अगर मैं ऐसा तरह empty
से निकाले जाते हैं:
struct derived : public empty
{
int data;
}
वहाँ नहीं रह गया है, आधार वर्ग empty
एक बाइट कब्जे में किसी भी बिंदु है, क्योंकि सभी derived
data
सदस्य की वजह से एक विशिष्ट पता होगा। उद्धरण "बेस क्लास सबोबजेक्ट्स का शून्य आकार हो सकता है" इस मामले में, संकलक के लिए empty
, sizeof(derived) == 4
के लिए किसी भी स्थान का उपयोग न करने के लिए मौजूद है। शीर्षक के अनुसार, यह सिर्फ एक अनुकूलन है, और शून्य स्थान पर कब्जा करने के लिए derived
के भाग के लिए यह पूरी तरह से कानूनी है।
आपको लगता है कि भंडारण का क्षेत्र शून्य आकार का नहीं हो सकता है? जाहिर है यह कर सकते हैं :) –
कॉल मॉलोक (0)। – bmargulies
@bmargulies 'malloc' विशेष रूप से इतना है कि यह शून्य आकार की एक वस्तु बनाने के लिए की जरूरत नहीं है सी में शब्दों है:" का अनुरोध किया अंतरिक्ष के आकार शून्य है, व्यवहार कार्यान्वयन-de फाई नेड है: या तो एक नल पॉइंटर दिया जाता है , या व्यवहार ऐसा है जैसे आकार कुछ nonzero मान थे " –