क्या आकार (बूल) C ++ भाषा मानक में परिभाषित किया गया है?


115

मुझे मानक प्रलेखन में जवाब नहीं मिल रहा है। क्या सी ++ भाषा मानक sizeof(bool)को हमेशा 1 (1 बाइट के लिए) की आवश्यकता होती है, या क्या यह आकार कार्यान्वयन-परिभाषित है?

जवाबों:


167

sizeof(bool) कार्यान्वयन को परिभाषित किया गया है, और मानक इस तथ्य पर उल्लेखनीय जोर देता है।

§5.3.3 / 1, संक्षिप्त:

sizeof(char), sizeof(signed char)और sizeof(unsigned char)1 हैं; sizeofकिसी अन्य मौलिक प्रकार पर लागू होने का परिणाम कार्यान्वयन-परिभाषित है। [नोट: विशेष रूप से, sizeof(bool)और sizeof(wchar_t)कार्यान्वयन-परिभाषित हैं। 69) ]

फुटनोट 69):

sizeof(bool) 1 होना आवश्यक नहीं है।


क्या कोई ऐसा ध्वज है जिसे मुझे अपने कार्यक्रम को संकलित करने की आवश्यकता है, कि मेरा संकलक केवल 1 बाइट का उपयोग करेगा bool?
ईगल

3
@ ईगल: यह आपके कंपाइलर पर निर्भर है, मुझे यकीन नहीं है। यह शायद सबसे अच्छा है कि आपने इसे अपने कंपाइलर पर छोड़ दिया है।
GManNickG

5
ध्यान दें कि std :: वेक्टर <bool> मानक द्वारा 1bit बूल वाले वेक्टर से अनुकूलित है।
user3063349

15

http://msdn.microsoft.com/en-us/library/tf4dy80a.aspx

"विज़ुअल सी ++ 4.2 में, मानक सी ++ हेडर फ़ाइलों में एक टाइपडिफ होता है जो बूल को इंट के साथ समेटता है। विज़ुअल सी ++ 5.0 और बाद में, बूल को 1 बाइट के आकार के साथ बिल्ट-इन प्रकार के रूप में लागू किया जाता है। इसका मतलब है कि विज़ुअल के साथ। C ++ 4.2, sizeof (बूल) की एक कॉल 4 उपज देती है, जबकि Visual C ++ 5.0 और बाद में, एक ही कॉल की पैदावार होती है। यह मेमोरी करप्शन की समस्या पैदा कर सकता है यदि आपने Visual C ++ 4.2 में टाइप बूल के स्ट्रक्चर मेम्बर्स को परिभाषित किया है और मिक्स ऑब्जेक्ट है फ़ाइलें (OBJ) और / या DLL 4.2 और 5.0 या बाद के संकलक के साथ बनाया गया। "


2
आपको एहसास है कि यह कुछ हद तक सवाल से संबंधित है, लेकिन स्पष्ट रूप से एक जवाब नहीं है, क्योंकि 0xbadf00d ने मानक के बारे में पूछा, कुछ विशिष्ट / मनमाने ढंग से चयनित संकलक कार्यान्वयन नहीं?
क्रिस्टोफर क्रेउत्जिग

13
@ChristopherCreutzig यह counterexample द्वारा एक प्रमाण है।
किनोकिजुफ २४'१४

12
@kinokijuf यह एक प्रतिसाद नहीं है। विजुअल C ++ में कई चीजें हैं जो मानक-अनुरूप नहीं हैं।
0xbadf00d

11

यह कार्यान्वयन परिभाषित है। केवल sizeof(char)है 1मानक से।


2
pls ध्यान दें कि मानक में 1 का अर्थ 4 बाइट हो सकता है। हर प्रकार से 4 का एक उत्पाद है। इतना ध्यान रखें कि मानक केवल परिभाषित करता है कि चर 1 है, लेकिन माप को परिभाषित नहीं करता है।
user3063349

1 का अर्थ है मानक में 8 बिट्स या 1 बाइट
पॉल

11
1 बाइट। बाइट प्रति बिट की संख्या मानक द्वारा परिभाषित नहीं की गई है (इसे कम से कम 8 आईआईआरसी होने की आवश्यकता है), लेकिन इसमें CHAR_BITपरिभाषित किया जा सकता है climits
पीरो

3

5.3.3 पैरा 1 देखें:

[नोट: विशेष रूप से, आकार (बूल) और आकार (wchar_t) कार्यान्वयन-परिभाषित हैं। ६ ९)]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.