आकार को संकलन-समय ऑपरेटर क्यों कहा जाता है?


12

मूल रूप से, यह एक अन्य प्रश्न का एक हिस्सा है ।

sizeofकंपाइल-टाइम ऑपरेटर क्यों कहा जाता है? क्या यह वास्तव में एक रन-टाइम ऑपरेटर नहीं है? और अगर यह वास्तव में एक संकलन-समय ऑपरेटर है, तो यह पोर्टेबल कोड बनाने में कैसे मदद करता है जो विभिन्न कंप्यूटरों में समान चलता है? कृपया विस्तार से बताएं।


4
SO पर विवरण में उत्तर दिया गया: साइज़ोफ़ (x ++) इंक्रीमेंट x क्यों नहीं है?
gnat

3
आप रनटाइम में एक प्रकार के आकार की अपेक्षा कैसे करते हैं?

@ मिचेल्ट: एक प्रकार के उदाहरण का आकार निश्चित रूप से बदल सकता है - सभी के बाद वर्ग बहुरूपता है। मेरा तर्क है कि sizeof(polymorphic_ptr*)निरंतर रहना काफी प्रति-सहज और सिर्फ मूर्खतापूर्ण है। हाँ, यह C ++ तरीका है, लेकिन फिर भी मूर्खतापूर्ण है।
मोनिका

@ कुबाओबर वास्तव में। मैं बस उत्सुक हूं कि ओपी ने कैसे सोचा कि यह अलग-अलग मामलों में व्यवहार करना चाहिए और उम्मीद है कि कुछ कोड मिलेंगे जो इस सवाल को बढ़ाने में मदद करने के लिए इस पर अपने भ्रम को प्रदर्शित करेंगे।

4
उत्तर को उत्कीर्ण करने के लिए आया था "क्योंकि यह संकलन समय पर चल रहा है", निराश छोड़ दिया।
बेन जैक्सन

जवाबों:


23

sizeof()आपको डेटा प्रकार का आकार देता है , न कि स्मृति में उस प्रकार के किसी विशेष उदाहरण का आकार।

उदाहरण के लिए, यदि आपके पास एक स्ट्रिंग डेटा ऑब्जेक्ट था जो रनटाइम पर एक चर आकार चरित्र सरणी आवंटित करता था, तो sizeof()उस चरित्र सरणी के आकार को निर्धारित करने के लिए उपयोग नहीं किया जा सकता था। यह आपको केवल पॉइंटर का आकार देगा।

डेटा प्रकार का आकार हमेशा संकलन समय पर जाना जाता है।


3
क्योंकि C (++) में रन-टाइम ऑब्जेक्ट मेटाडेटा नहीं है, आप वास्तव में रन टाइम पर उन चीजों को प्राप्त नहीं कर सकते हैं।
सी। रॉस

5
वास्तव में, यदि आप का उपयोग sizeofएक सरणी पर, आप होगा सरणी के आकार (है कि तत्व आकार बार तत्वों की संख्या) मिलता है। लेकिन अगर आप इसे पॉइंटर पर इस्तेमाल करते हैं, तो आपको केवल पॉइंटर का आकार मिलता है। इसलिए, ज्यादातर मामलों में जहां आप एक सरणी का आकार जानना चाहते हैं, आपके पास केवल एक सूचक है, यह सब उपयोगी नहीं है।
sepp2k

1
@ जेन्स प्रश्न को टैग किया गया है [C ++] और VLA ने इसे C ++ मानक में नहीं बनाया है।
ऑक्टोचिर

13

क्योंकि संपूर्ण आकार "कॉल" की गणना संकलन समय पर की जाती है और जो कुछ भी कोष्ठक के बीच होता है उसे छोड़ दिया जाता है और रनटाइम पर नहीं चलाया जाता है,

परिणाम विशुद्ध रूप से संकलक के लिए उपलब्ध स्थिर प्रकार की जानकारी पर आधारित है


7

आकार को संकलन-समय ऑपरेटर क्यों कहा जाता है?

क्योंकि, संकलन के समय, संकलक आकार की गणना करता है और संकलित करता है जो संकलन-समय निरंतर मूल्य को प्रतिस्थापित करता है।

क्या यह वास्तव में एक रन-टाइम ऑपरेटर नहीं है?

नहीं। आप उन sizeofअभिव्यक्तियों के आकार का मूल्यांकन करने के लिए भी उपयोग कर सकते हैं जिन्हें आप कानूनी रूप से निष्पादित नहीं कर सकते हैं (अर्थात, अपरिभाषित व्यवहार को उत्तेजित करेंगे), इसलिए जब तक संकलक यह पता लगा सकता है कि अभिव्यक्ति का प्रकार क्या है।

इसके अलावा, C ++ 11 से पहले भी constexpr, आप उन sizeofतरीकों का उपयोग कर सकते हैं, जिन्हें आप रन-टाइम अभिव्यक्तियों का उपयोग नहीं कर सकते हैं।

और अगर यह वास्तव में एक संकलन-समय ऑपरेटर है, तो यह पोर्टेबल कोड के उत्पादन में कैसे मदद करता है ...

विभिन्न प्लेटफार्मों पर आकार में प्रकार भिन्न हो सकते हैं। sizeofहार्ड-कोडित मान्यताओं के बजाय अभिव्यक्ति का उपयोग करने का मतलब है कि जब आप एक अलग मंच और आपके प्रकार परिवर्तन आकार पर संकलन करते हैं तो आपका कोड नहीं टूटेगा।


1
खैर, मुझे यह सबसे उपयोगी उत्तर लगता है;)। भाई (आप को पुरुष मानते हुए), मुझे संदेह है। क्या आपके कहने का मतलब यह है कि जब लोग कहते हैं कि साइज़ोफ कार्यक्रमों को पोर्टेबल बनाता है, तो उनका मतलब है कि स्रोत कोड को सभी मशीनों में किसी भी त्रुटि के बिना संकलित किया जा सकता है और उनका मतलब यह नहीं है कि निष्पादन योग्य कार्यक्रम किसी भी मशीन में चलाया जा सकता है। सही ? यदि यह सही है, तो मेरा संदेह सचमुच साफ़ हो जाता है।
शांतिप्रिय कोडर

1
हाँ, कोड पोर्टेबल है, इस अर्थ में आप प्रत्येक प्लेटफ़ॉर्म के लिए अलग (अलग) सही बाइनरी संकलित कर सकते हैं।
बेकार

5

C ++ वास्तव में रनटाइम पर ऑब्जेक्ट्स के लिए मेटाडेटा संग्रहीत नहीं करता है, इसलिए आकार की जाँच का संकलन समय होना चाहिए। उदाहरण के लिए कि C ++ आकार को कैसे मान्य नहीं करता है, intकुछ मनमाने आकार की एक सरणी की घोषणा करें और इसके पिछले हिस्से को पढ़ें। यदि आप भाग्यशाली हैं, तो आपको एक segfaultऔर अधिक संभावना मिलेगी, लेकिन आप बस अस्पष्ट पढ़ेंगे, क्योंकि C ++ आपके सरणी के आकार को ट्रैक नहीं करता है।

एक सरणी (UNIX) के अंत में पढ़ने से क्या C / C ++ प्रोग्राम सेग-फॉल्ट देख सकता है? एसओ से एक उदाहरण के लिए।

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