2011-12-15 10 views
9

मैं सोच रहा था कि कक्षा के लिए आकार सीमा क्या है। मैं एक साधारण परीक्षण किया:कक्षा के लिए आकार सीमा क्या है?

#define CLS(name,other) \ 
class name\ 
{\ 
public: \ 
name() {};\ 
    other a;\ 
    other b;\ 
    other c;\ 
    other d;\ 
    other e;\ 
    other f;\ 
    other g;\ 
    other h;\ 
    other i;\ 
    other j;\ 
    other k;\ 
}; 

class A{ 
    int k; 
public: 
    A(){}; 
}; 

CLS(B,A); 
CLS(C,B); 
CLS(D,C); 
CLS(E,D); 
CLS(F,E); 
CLS(G,F); 
CLS(H,G); 
CLS(I,H); 
CLS(J,I); 

यह

साथ संकलित करने के लिए विफल रहता है " 'जे': वर्ग बहुत बड़ा है"

अगर मैं अंतिम घोषणा को दूर - CLS(J,I);, यह सब ठीक संकलित करता है।

क्या यह एक संकलक-लगाया प्रतिबंध है, या यह मानक में कहीं है?

+0

अंतिम परिभाषा के साथ आप जे कक्षा के लिए लगभग 10 जीबी (पैडिंग के आधार पर) तक पहुंचते हैं। – dalle

+0

मैं बस इसे घोषित कर रहा था, वास्तव में इसका उपयोग नहीं कर रहा था।मैं शर्त लगाता हूं कि कुछ एच कक्षाओं की एक सरणी रनटाइम तोड़ देगी :) –

उत्तर

14

सी ++ 11 में इस अनुबंध बी क्रियान्वयन सीमा लागू कर सकते हैं, लेकिन वे किया जाना चाहिए कम से कम:

  • एक वस्तु [262 144] का आकार।
  • एक ही कक्षा में डेटा सदस्य [16 384]।
  • सदस्यों को एक कक्षा में घोषित किया गया [4 9 6]।

तीसरा सीधे निर्माण का उपयोग कर रहे के प्रकार से संबंधित नहीं है, मैं यह उल्लेख सिर्फ इसलिए कि यह इंगित करता है कि एक दूसरे वास्तव में कुल सदस्यों है, शायद ठिकानों और मैं में उन सहित सदस्यों के सदस्यों के बारे में निश्चित नहीं है। लेकिन यह सिर्फ एक वर्ग परिभाषा में सूचीबद्ध सदस्यों के बारे में नहीं है।

आपका कार्यान्वयन प्रकट होता है या तो 2^31 डेटा सदस्यों छोड़ दिया है, या आकार 2^32 पर है, क्योंकि यह I नहीं बल्कि J स्वीकार करता है। यह एक संकलक के लिए SIZE_MAX से अधिक आकार वाले वर्गों पर विचार करने से इंकार करने के लिए काफी स्पष्ट रूप से उचित है, भले ही प्रोग्राम इसे चालू नहीं करता है या इस प्रकार sizeof का उपयोग नहीं करता है। तो संकलक के हिस्से पर सबसे अच्छे संभव प्रयास के साथ भी मैं कभी 32 बिट कार्यान्वयन पर काम करने की उम्मीद नहीं करता।

ध्यान दें कि "ये मात्रा केवल दिशानिर्देश हैं और अनुपालन निर्धारित नहीं करती हैं", इसलिए एक अनुरूप प्रभाव एक मनमानी छोटी सीमा लगा सकता है, यहां तक ​​कि इसमें बड़ी संख्या में उपयोग किए जाने वाले प्रोग्राम को संकलित करने के लिए पर्याप्त संसाधन हैं। अनुरूपता के लिए कोई न्यूनतम सीमा नहीं है।

हास्यास्पद रूप से छोटी संसाधन सीमाओं के कारण बेकार होने के लिए एक अनुरूप कार्यान्वयन के लिए सी ++ मानक में कई अवसर हैं, इसलिए यदि कोई दूसरा नुकसान हो तो कोई अतिरिक्त नुकसान नहीं हुआ है।

सी ++ 03 अधिक या कम एक ही है:

  • एक वस्तु [262 144] का आकार।
  • एकल वर्ग, संरचना या संघ में डेटा सदस्य [16 384]।
  • सदस्यों को एक कक्षा में घोषित किया गया [4 9 6]।
+0

बिल्कुल सही, धन्यवाद। –

+0

@ स्टेव जेसॉप। ध्यान दें कि अनुलग्नक बी मानक नहीं है --- वहां दिए गए मानों को अनुशंसित न्यूनतम सीमाएं दी जाती हैं, और वास्तव में, मुझे आश्चर्य होगा कि 16 बिट सिस्टम ने 65565 से अधिक आकार वाले वर्ग का समर्थन किया है। –

+0

@ जेम्स: हाँ, मैंने ध्यान दिया है कि। 16 बिट के बारे में अच्छा बिंदु, आप उम्मीद करेंगे कि 'SIZE_MAX' अनुशंसित सीमा से कम हो। –

0

मुझे यकीन है कि इसका कंपाइलर निर्भर है। आप अपने कंपाइलर को केवल प्रीप्रोसेस मोड में चला सकते हैं यह देखने के लिए कि उत्पन्न उत्सुकता क्या है यदि आप उत्सुक हैं। आप मैक्रोज़ के बजाय टेम्पलेट विस्तार को भी देखना चाहते हैं।

+0

यह सिर्फ एक शुद्ध सैद्धांतिक सवाल था, इसलिए मैं मैक्रोज़ का उपयोग कर रहा हूं। मुझे टेम्पलेट्स की आवश्यकता क्यों होगी? साथ ही, यदि यह संकलक विशिष्ट है, तो मानक में न्यूनतम सीमा का कुछ उल्लेख होना चाहिए। यही वह जवाब है जिसे मैं ढूंढ रहा था। –

संबंधित मुद्दे