2013-04-05 11 views
16

This answer एक दिलचस्प बयान के साथ आता है - "मशीनों पर int*char* से छोटा है"। (आइए पॉइंटर्स को फ़ंक्शंस में बहिष्कृत करें)पॉइंटर्स विभिन्न आकारों के हो सकते हैं?

क्या विभिन्न प्रकार के पॉइंटर्स के लिए विभिन्न आकारों के लिए यह संभव है? यह उपयोगी क्यों होगा?

+3

यह उपयोगी हो सकता है: http://stackoverflow.com/questions/12006854/why-the-size-of-a-pointer-to-a- कार्यक्षमता-is- अलग-from-the-size-of- ए-पॉइंटर –

+2

@ किरिलकिरोव जो दिलचस्प है (मुझे लगता है कि मैंने तुरंत विचार की अपनी ट्रेन से फंक्शन पॉइंटर्स को बाहर कर दिया)। अच्छी जानकारी! –

+1

@ किरिलकिरोव मैं आलसी था कि आप अपने लिंक की जांच न करें, लेकिन ऐसा लगता है कि मेरा जवाब अनावश्यक है-.- –

उत्तर

14

हां, यह पूरी तरह से संभव है। कुछ मशीनों पर, बाइट के पॉइंटर में दो मान होते हैं: बाइट युक्त मेमोरी शब्द के शब्द पते के लिए एक सूचक, और एक "बाइट इंडेक्स" जो शब्द के भीतर बाइट की स्थिति देता है। जैसे 32-बिट मशीन पर, "बाइट इंडेक्स" 0..3 है।

इसके लिए "int *" की तुलना में अधिक संग्रहण स्थान की आवश्यकता होगी, जो प्रासंगिक शब्द के लिए केवल एक सूचक है।

+0

। कोई भी अजीब मशीन की कल्पना भी कर सकता है जहां अलग-अलग मेमोरी बैंकों में अलग-अलग डेटा संग्रहीत किया जाता है, प्रत्येक को अपने तरीके से संबोधित किया जाता है। –

+0

क्या आप कृपया ऐसी मशीनों का नाम दे सकते हैं, मैट? –

+9

@ मार्टिनविड्नर: मैंने अभी आपके लिए अपने दिमाग में एक का आविष्कार किया है। –

4

हां, पॉइंटर्स को एक ही आकार के लिए गारंटी नहीं है, हालांकि अधिकांश आधुनिक आर्किटेक्चर पर वे अभ्यास में हैं।

एक बिंदु जहां यह उपयोगी हो सकता है जब कोई डेटा बनाम फ़ंक्शन पॉइंटर्स से संबंधित होता है। ऐतिहासिक रूप से, फ़ंक्शन पॉइंटर्स (जिनका उपयोग निष्पादन योग्य कोड में कुछ हिस्सों में अनिवार्य रूप से कूदने के लिए किया जाता है) को डेटा पॉइंटर्स से अधिक व्यापक "दूर पॉइंटर्स" की आवश्यकता होती है।

6

शब्द संबोधित मशीनों पर char* को भाग-शब्द जानकारी रखने की आवश्यकता हो सकती है, जिससे इसे int* से बड़ा बना दिया जा सकता है।

मानक इस तरह के हार्डवेयर पर कार्यान्वयन को नकारने की अनुमति देता है (भले ही सी 8 9 डिजाइन किए जाने की तुलना में अब भी दुर्लभ है)।

+0

आपके उत्तर को लिंक किया [यहां] (http://stackoverflow.com/a/29035972/1708801) क्या आप अन्य मामलों के बारे में जानते हैं जहां 'char *' का 'int *' से भिन्न आकार है? –

2

मैं एक ऐसी मशीन की कल्पना कर सकता हूं जहां यह मानना ​​पड़ेगा कि int सरणी के लिए मेमोरी की आवश्यकता char सरणी के लिए स्मृति आवश्यकताओं की तुलना में बहुत कम होगी।

उदाहरण के लिए, एक कार्यान्वयन 10 से अधिक गतिशील आवंटित पूर्णांक का उपयोग नहीं करेगा, लेकिन कई char सरणी आवंटित करने के लिए स्वतंत्र है। इस मामले में, एक बाइट int* के लिए पर्याप्त हो सकता है, जबकि char* को चार बाइट या अधिक होने की आवश्यकता है।

यह एक सैद्धांतिक दृष्टि है।

+0

256 से अधिक गतिशील आवंटित पूर्णांक, यहां तक ​​कि, यदि एक बाइट पर्याप्त है। –

+0

मैं 4 बिट पॉइंटर्स का उल्लेख करना चाहता था, लेकिन मैंने सोचा कि शीर्ष पर था :) – xtofl

5

टैग का अर्थ है कि आप सी ++ और उसके अनुपालन कार्यान्वयन के बारे में पूछ रहे हैं, कुछ विशिष्ट भौतिक मशीन नहीं।

मैं इसे साबित करने के लिए में पूरे मानक उद्धृत करने के लिए होगा, लेकिन साधारण तथ्य यह है कि यह किसी भी T के लिए sizeof(T*) के परिणाम पर कोई गारंटी नहीं देता है, और (एक परिणाम के रूप में) कोई गारंटी देता है कि किसी के लिए sizeof(T1*) == sizeof(T2*)T1 और T2)।

+0

मैं हूं। किसी और चीज की अनुपस्थिति में, मुझे लगता है कि 'केवल चार आकार और हस्ताक्षरित चार' का आकार गारंटीकृत होगा। –

+0

@ लचियनग्रिगोर: निश्चित रूप से, जब तक आप उल्लेख करते हैं कि कुछ प्रकारों पर _are_ अन्य बाधाएं हैं। –

+1

"प्रकार की सीवी शून्य * की एक वस्तु में सीवी char * के रूप में समान प्रतिनिधित्व और संरेखण आवश्यकताएं होंगी" – PlasmaHH

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