2017-11-22 3 views
5

मैं अक्सर मानता हूं कि एक गणना का आकार इसके अंतर्निहित प्रकार के आकार के समान है। लेकिन क्या यह मानक द्वारा अनिवार्य है?सी ++ में, क्या गणना का आकार इसके अंतर्निहित प्रकार के आकार के बराबर होना चाहिए?

मानक (सी ++ 14, एन 4296) कहता है कि प्रत्येक गणना में अंतर्निहित प्रकार (7.2/5) होता है। मानक भी कहता है कि वस्तुओं बाइट्स के दृश्यों के रूप में प्रतिनिधित्व कर रहे हैं, और है कि एक वस्तु का आकार इसके प्रतिनिधित्व से संबंधित है:

3,9/4 प्रकार टी की एक वस्तु की वस्तु प्रतिनिधित्व एन के अनुक्रम है टाइप टी के ऑब्जेक्ट द्वारा उठाए गए हस्ताक्षरित चार ऑब्जेक्ट्स, जहां एन आकार (टी) के बराबर है।

5.3.3/1 आकार का ऑपरेटर ऑब्जेक्ट ऑब्जेक्ट के प्रतिनिधित्व में बाइट्स की संख्या उत्पन्न करता है।

हालांकि, मैं enum के अंतर्निहित प्रकार और ऑब्जेक्ट प्रस्तुति के बीच कोई संबंध नहीं ढूंढ पाया। क्या वहाँ कोई? यदि नहीं, तो मैं तर्क दूंगा कि एक गणना के आकार को इसके अंतर्निहित प्रकार का आकार नहीं होना चाहिए।

तो मेरी प्रश्न हैं:

  1. वहाँ एक enum की अंतर्निहित प्रकार और उसके वस्तु प्रतिनिधित्व के बीच कोई संबंध है?

  2. क्या मानक को वास्तव में sizeof(std::underlying_type_t<E>) == sizeof(E) किसी भी गणना ई के लिए आवश्यक है?

+0

मुझे 99% यकीन है कि उन्हें एक ही आकार होना चाहिए। जैसे 'std :: byte' है, जो केवल 'enum class byte है: unsigned char' (हस्ताक्षरित या हस्ताक्षरित याद नहीं किया जा सकता है), और यह एक ही आकार होने की गारंटी है। मुझे यकीन नहीं है कि यह मानक में कहां है, यद्यपि। – Justin

+0

अन्यथा यह आकार क्या होगा? –

+0

@NeilButterworth कोई बड़ा? यह कम से कम यूटी जितना बड़ा होना चाहिए, क्योंकि इसे अपने सभी मूल्यों को स्टोर करना है। –

उत्तर

1

से लिया: What is the underlying type of a c++ enum?, एक बड़ी सी ++ मानक 7.2/5 पर कहा:

एक गणन के अंतर्निहित प्रकार एक अभिन्न प्रकार है कि सभी प्रगणक गणना में परिभाषित मूल्यों का प्रतिनिधित्व कर सकते हैं । यह क्रियान्वयन-परिभाषित है जो अंतर्निहित के रूप में अंतर्निहित प्रकार का उपयोग किया जाता है, इसके अलावा अंतर्निहित प्रकार int से बड़ा नहीं होगा जब तक कि enu- merator का मान int या unsigned int में फिट नहीं हो सकता है। यदि गणनाकर्ता सूची खाली है, तो अंतर्निहित प्रकार इस प्रकार है कि गणना के मूल्य 0 के साथ एक समकक्ष था। आकार() को एक enu- meration प्रकार पर लागू किया गया है, गणना प्रकार, या एक गणक का एक ऑब्जेक्ट , अंतर्निहित प्रकार के आकार() लागू का मान है।

7) एक गणन जिसका अंतर्निहित प्रकार निश्चित नहीं है के लिए, अंतर्निहित प्रकार एक अभिन्न प्रकार है कि कर सकते हैं है:

draft n4606 निकटतम मैं मिल सकता से 7.2/7 + 8 जिसमें कहा गया है गणित में परिभाषित सभी गणक मूल्य का प्रतिनिधित्व करते हैं। यदि कोई अभिन्न प्रकार सभी गणना मूल्यों का प्रतिनिधित्व नहीं कर सकता है, तो गणना खराब हो गई है। यह कार्यान्वयन-परिभाषित है कि अभिन्न प्रकार का उपयोग अंतर्निहित प्रकार के रूप में किया जाता है, सिवाय इसके कि अंतर्निहित प्रकार int से बड़ा नहीं होगा जब तक कि कोई गणक का मान int या unsigned int में फिट नहीं हो सकता है।यदि प्रगणक-सूची खाली है, अंतर्निहित प्रकार है के रूप में यदि गणन मूल्य 0.

8) एक गणन जिसका अंतर्निहित प्रकार तय हो गई है के लिए के साथ एक एकल प्रगणक था, गणन के मूल्यों के मान हैं अंतर्निहित प्रकार। अन्यथा, एक गणना के लिए जहां एमिन सबसे छोटा गणक और इमैक्स सबसे बड़ा है, के मानों की गणना के रूप में परिभाषित बीएमएक्स के लिए सीमा बीएमएक्स में मान हैं: दो को दो पूरक पूरक के लिए 1 दें और 0 के लिए 'पूरक या साइन-आयाम प्रतिनिधित्व के लिए। बीएमएक्स अधिकतम से अधिक या अधिकतम (| emin | - के, | emax |) और 2 एम -1 के बराबर है, जहां एम एक गैर-ऋणात्मक पूर्णांक है। एमिन गैर-ऋणात्मक है और - (बीएमएक्स + के) अन्यथा बीएमएन शून्य है। का आकार गणित प्रकार के सभी मानों को पकड़ने के लिए पर्याप्त छोटा सा क्षेत्रफल अधिकतम है (एम, 1) यदि बिन शून्य है और एम + 1 अन्यथा है। यह एक गणना को परिभाषित करना संभव है जिसमें मूल्यों को द्वारा परिभाषित नहीं किया गया है, इसके किसी भी गणक। यदि प्रगणक-सूची खाली है, गणन के मूल्यों के रूप में अगर गणन मूल्य 0

के साथ एक एकल प्रगणक था एक ओर यह काफी करीब है, वहीं दूसरी ओर लगता है, विशिष्ट मांग कर रहे हैं sizeof() ऑपरेटर को हटा दिया गया था। फिर भी मुझे लगता है कि यह कहना सुरक्षित है कि दोनों प्रश्नों के उत्तर हाँ हैं।

1

मैं मानक खोज की है, और यह मैं (मैं जानता हूँ कि यह पर्याप्त नहीं हो सकता है) मिल सकता है सबसे अच्छा है:

अंतर्निहित प्रकार परोक्ष यहाँ (सी की 3.9.1/5 परिभाषित किया गया है ++ 14):

प्रकार wchar_t अलग प्रकार जिनके मान समर्थित स्थानिक (22.3.1) के बीच सबसे बड़ा विस्तारित चरित्र सेट विशिष्ट एड के सभी सदस्यों के लिए अलग कोड का प्रतिनिधित्व कर सकते हैं। टाइप करें wchar_t में आकार, हस्ताक्षर और संरेखण आवश्यकताओं (3.11) अन्य अभिन्न प्रकारों में से एक के रूप में होगा, जिसे इसके अंतर्निहित प्रकार कहा जाता है। प्रकार char16_t और char32_t समान आकार, हस्ताक्षर, और क्रमशः uint_least16_t और uint_least32_t के रूप में संरेखण को <cstdint> में अंतर्निहित प्रकार कहा जाता है, के साथ अलग-अलग प्रकारों को दर्शाता है।

इस परिभाषा wchar_t के बारे में है, लेकिन मुझे लगता है कि यह है कि उस अंतर्निहित प्रकार के लिए परिभाषा है कहने के लिए सुरक्षित है। (कम से कम, मानक देता है कि यह सबसे अच्छी परिभाषा है।इसके अलावा, अंतर्निहित प्रकार के लिए सी ++ 14 मानक के सूचकांक यहाँ करने के लिए)

इसका मतलब है कि संदर्भित करता है:

  1. प्रतिनिधित्व होना चाहिए एक ही

  2. आकार बराबर होना चाहिए

(लेकिन मुझे लगता है कि अंतर्निहित प्रकार परिभाषित किया जाना चाहिए bette मानक में आर)

+0

धन्यवाद। मुझे यह भी मिला है। यह "इसके अंतर्निहित प्रकार" कहता है, इसलिए मैं कहूंगा कि यह केवल समान रूप से wchar_t के लिए अंतर्निहित प्रकार को परिभाषित करता है जो कि enums के लिए 7.2/5 तक है। –

+0

@ JanTušil: हाँ, लेकिन पाठ थोड़ा अलग है। यहां, इसे "इसके अंतर्निहित प्रकार" कहा जाता है, इसलिए इसका अर्थ अर्थात् "अंतर्निहित प्रकार में इन गुणों का अर्थ है, यह परिभाषा है" (केवल wchar_t के लिए नहीं)। Enums के लिए, वे इस तरह से नहीं कहते हैं। लेकिन हाँ, कोई भी आप की तरह व्याख्या कर सकते हैं। मानक यहां अस्पष्ट है, सुधार किया जाना चाहिए। यहां तक ​​कि यदि आप इस परिभाषा को स्वीकार करते हैं, तो 1 का उत्तर 100% सटीक नहीं है, क्योंकि कहीं भी लिखा नहीं गया है कि अंतर्निहित repr वही होना चाहिए। लेकिन यह बहुत अजीब होगा अगर यह नहीं था (तब इसका नाम "अंतर्निहित" क्यों होगा?)। – geza

+0

मैं कहूंगा कि यह उद्धरण केवल wchar_t –

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