2015-11-04 7 views
13

मैं 64-बिट संकलन को समझने के लिए कोशिश कर रहा हूँ, इसलिए मैं सी ++ बिल्डर में एक छोटे से परीक्षण किया:64-बिट सिस्टम पर बड़े पॉइंटर्स का क्या फायदा है?

int i = 12345; 
    ShowMessage(i); 
    int *pi = &i; 
    ShowMessage(sizeof(pi)); 


    Largeint li = 9223372036854775807; 
    ShowMessage(li); 
    Largeint *pli = &li; 
    ShowMessage(sizeof(pli)); 

जब मैं 64 बिट, सूचक के आकार के रूप में इस कार्यक्रम को संकलित 8 बाइट्स बढ़ जाती है (64 बिट्स)।

बढ़ते सूचक आकार का क्या फायदा है?

+13

ए '4'-बाइट पॉइंटर केवल ~ 4 जीबी मेमोरी को संबोधित कर सकता है। यह एक आधुनिक कार्यक्रम में तेजी से भाग सकता है। – BoBTFish

+7

एक सूचक का आकार आमतौर पर अंतर्निहित प्रणाली को दर्शाता है। यदि आप 32-बिट सिस्टम पर हैं, तो आपको 32-बिट पॉइंटर्स मिलते हैं, और 64-बिट सिस्टम पर आपको 64-बिट पॉइंटर्स मिलते हैं। यह वास्तव में कुछ और करने के लिए समझ में नहीं आता है। –

+0

बेशक कि 64 बिट्स सिस्टम में 32 बिट उपप्रणाली हैं। इसका मतलब 32 बिट प्रक्रिया प्रति 4 जीबी सीमा है, लेकिन कुल सिस्टम मेमोरी तब और अधिक हो सकती है। – MSalters

उत्तर

29

एक सूचकस्मृति में एक भी बाइट की पता पकड़ कर सकते हैं। इसके आकार के आधार पर आप दिए गए पॉइंटर स्टोर किए जा सकने वाले विभिन्न मानों की अधिकतम संख्या की गणना कर सकते हैं। ,

2^32 = 4294967296 

दूसरी ओर एक 8 बाइट्स (:

4 बाइट ( 32 बिट) के एक सूचक के साथ

आप केवल 4GB स्मृति के संबोधित करने के लिए सीमित हैं के बाद से

: 64 बिट) सूचक 17179869184GB सैद्धांतिक रूप से की एक अधिक व्यापक रेंज को संबोधित करने में सक्षम है 10
2^64 = 18446744073709551616 

यह 16EB (एक्साबाइट्स) हैं।

अभ्यास में, यह क्योंकि ज्यादातर प्रोसेसर पर सीमाओं और स्मृति के शारीरिक आकार के बहुत कम है कि तुलना में है, आदि

आपके पास इस विषय यहाँ के बारे में अधिक पढ़ सकते हैं:
https://en.wikipedia.org/wiki/64-bit_computing#Limitations_of_practical_processors

+0

"4 बाइट्स (32 बिट्स) के पॉइंटर के साथ आप केवल 4 जीबी मेमोरी को संबोधित करने के लिए सीमित हैं" अच्छा जवाब। लेकिन यह सीमा क्यों है? –

+3

मैंने अपने उत्तर के शीर्ष पर थोड़ा सा स्पष्टीकरण जोड़ा। क्या यह अभी स्पष्ट है? 32 बिट्स (4 बाइट्स) के साथ आपके पास "केवल" 42 9 4 9 672 9 6 संभावित मूल्य हैं। तो आप स्मृति में 42 9 4 9 672 9 6 विभिन्न बाइट्स को संबोधित कर सकते हैं, जो 4 जीबी –

+0

धन्यवाद @oo_miguel –

7

जब तक आप मेमोरी पेजिंग के पुराने दिनों में वापस नहीं जाना चाहते हैं (1 9 80 के दशक में 128k रैम के साथ उन 16 बिट जेड 80 मशीनों को याद रखें), या प्रारंभिक डॉस ने स्मृति को विस्तारित किया है, तो आपको उपलब्ध सभी को संबोधित करने के लिए 32 बिट पॉइंटर से अधिक की आवश्यकता है एक आधुनिक मशीन पर स्मृति।

64 बिट पॉइंटर 64 बिट आर्किटेक्चर के लिए एक प्राकृतिक (हालांकि आवश्यक नहीं) विकल्प है।

ध्यान दें कि नहीं है विभिन्न प्रकार के संकेत दिए गए एक ही आकार होना जरूरी: sizeof(double*), नहीं जरूरीsizeof(int*) के रूप में ही रहना होगा करता है, उदाहरण के लिए।

+0

Z80 और इस तरह 16-बिट पता सीमा होगी। –

+0

संशोधित। मुझे उन दिनों अच्छी तरह याद है; प्यार से! – Bathsheba

+0

उत्तर @ बाथशेबा –

2

जैसा कि अन्य उत्तरों में बताया गया है, यह एक पॉइंटर प्रकार होना स्वाभाविक है जो स्मृति में एक मनमाना स्थान को समान रूप से और निर्बाध रूप से इंगित कर सकता है।

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

ध्यान दें कि ये सभी डेटा संरचनाएं (ग्राफ, पेड़, हैश मानचित्र, आदि ...) को स्मृति में संगत सरणी में भी कार्यान्वित किया जा सकता है, और सूचकांक के माध्यम से उपयोग किया जा सकता है (यह है कि फ़ोरट्रान प्रोग्रामर उन्हें उदाहरण के लिए कैसे कार्यान्वित करते हैं), और यदि आप पहले से जानते हैं कि आपके पास 4 बिलियन से कम तत्व हैं, तो आप 32 के रूप में अपने सूचकांक का प्रतिनिधित्व कर सकते हैं बिट पूर्णांक, भले ही आप 64 बिट मोड में संकलित हों (यह वही है जो मैं 3 डी जाल मॉडलिंग सॉफ़्टवेयर के लिए कर रहा हूं)।

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