2012-02-21 18 views
34

मैं समझता हूं कि हार्डवेयर प्रोग्राम निष्पादन के दौरान आवंटित स्मृति की मात्रा को सीमित करेगा। हालांकि, हार्डवेयर के संबंध में मेरा प्रश्न है। मानते हैं कि स्मृति की मात्रा की कोई सीमा नहीं थी, क्या सरणी की कोई सीमा नहीं होगी?सी में सरणी का अधिकतम आकार क्या है?

+2

वास्तव में सॉफ्टवेयर (ओएस) देखें बात यह है कि सामान्य रूप से स्मृति सीमा आपकी सी कार्यक्रम के द्वारा देखा कारण होगा है। – TJD

+2

स्मृति पर एक सीमा के बिना, सूचक आकार पर कोई सीमा नहीं है। सूचक आकार पर सीमा के बिना, सभी दांव बंद हैं। – dasblinkenlight

+4

यह सूचक के आकार (32 बिट बनाम 64 बिट) –

उत्तर

33

कोई तय सी

किसी भी सरणी वस्तु के सहित किसी एक वस्तु का आकार, में एक सरणी के आकार के सीमा नहीं है, SIZE_MAX, प्रकार size_t का अधिकतम मान, द्वारा सीमित है जो sizeof ऑपरेटर का नतीजा है। (यह पूरी तरह से स्पष्ट नहीं है कि सी मानक SIZE_MAX बाइट्स से बड़ी वस्तुओं को अनुमति देता है, लेकिन व्यवहार में ऐसी वस्तुएं समर्थित नहीं हैं; फुटनोट देखें।) SIZE_MAX कार्यान्वयन द्वारा निर्धारित किया गया है, और किसी भी प्रोग्राम द्वारा संशोधित नहीं किया जा सकता है, जो ऊपरी बाउंड लगाता है किसी भी ऑब्जेक्ट के लिए SIZE_MAX बाइट्स का।

void* प्रकार की चौड़ाई, एक सामान्य सूचक प्रकार, निष्पादन कार्यक्रम में सभी ऑब्जेक्ट्स के कुल आकार पर ऊपरी सीमा लगाता है (जो एक ऑब्जेक्ट के अधिकतम आकार से बड़ा हो सकता है)।

सी मानक इन निश्चित आकारों पर, निम्न सीमाओं को लागू करता है, लेकिन ऊपरी सीमाएं नहीं लगाता है। कोई अनुरूप सी कार्यान्वयन अनंत आकार की वस्तुओं का समर्थन कर सकता है, लेकिन यह किसी भी सीमित आकार के सिद्धांतों का समर्थन कर सकता है। व्यक्तिगत सी कार्यान्वयन द्वारा ऊपरी सीमाएं लगाई जाती हैं, जिन वातावरण में वे काम करते हैं, और भौतिकी द्वारा, भाषा द्वारा नहीं।

उदाहरण के लिए, एक अनुरूप कार्यान्वयन जिसका मतलब है कि यह सिद्धांत में 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137215 बाइट तक वस्तुओं हो सकता था SIZE_MAX बराबर 2 को -1 हो सकता था,।

गुड लक ढूंढने वाले हार्डवेयर जो वास्तव में ऐसी वस्तुओं का समर्थन करते हैं।

फ़ुटनोट: वहाँ कोई स्पष्ट नियम है कि कोई भी वस्तु से बड़े SIZE_MAX बाइट्स हो सकता है। आप इस तरह के ऑब्जेक्ट पर sizeof ऑपरेटर को उपयोगी रूप से लागू नहीं कर सके, लेकिन किसी भी अन्य ऑपरेटर की तरह, sizeof अतिप्रवाह हो सकता है; इसका मतलब यह नहीं है कि आप ऐसी वस्तु पर संचालन नहीं कर सके। लेकिन व्यावहारिक रूप से, किसी भी साधु कार्यान्वयन size_t को किसी भी ऑब्जेक्ट के आकार का प्रतिनिधित्व करने के लिए काफी बड़ा कर देगा।

+0

क्या मैं उस अधिकतम विस्तार के लिए मनमाने ढंग से सटीक लाइब्रेरी का उपयोग नहीं कर सका? मेरा मतलब है, सैद्धांतिक रूप से बोल रहा है ...: पी –

+1

@ जे.सी.Leitão: सिद्धांत रूप में, मुझे लगता है कि एक कंपाइलर बहुत व्यापक पूर्णांक प्रकारों को लागू करने के लिए एक मनमाना सटीक पुस्तकालय का उपयोग कर सकता है। लेकिन आप इसे प्रोग्रामर के रूप में नहीं कर सकते; वास्तविक पूर्णांक प्रकार (अक्षर, ऑपरेटरों और इतने आगे के साथ) संकलक प्रदान करता है जो सीमित हैं। –

+0

[दूर पॉइंटर्स] (http://en.wikipedia.org/wiki/Far_pointer) का अस्तित्व है और correspoing स्मृति मॉडल किसी भी तरह से आपका जवाब बदलता है? – jfs

3

मुझे लगता है कि सबसे बड़ी सैद्धांतिक सरणी "अहस्ताक्षरित लंबे" (या जो भी सबसे बड़ी पूर्णांक संख्या नवीनतम मानक/अपने संकलक का समर्थन करता है) की अधिकतम मूल्य होगा

5

स्मृति के लिए संबंध, एक सरणी के अधिकतम आकार के बिना सरणी को इंडेक्स करने के लिए उपयोग किए गए पूर्णांक के प्रकार से सीमित है।

6

एक 64-बिट मशीन सैद्धांतिक रूप से स्मृति के अधिकतम 2^64 बाइट्स को संबोधित कर सकती है।

+0

द्वारा सीमित किया जाएगा, उस भाग को कंप्यूटर में उस मात्रा में डालने की शुभकामनाएं। मूर के कानून के साथ भी यह एक लंबा समय आ रहा है। –

+0

मैं कल्पना कर सकता हूं कि यह मेरे जीवनकाल में हो रहा है। –

+1

@AmigableClarkKant संपूर्ण * पृथ्वी * 2^64 परमाणुओं से कम है (यह केवल 5 * 10^24 किलोग्राम वजन) है, इसलिए आपकी उम्मीदें * बहुत * * बहुत * अतिव्यापी हैं। SCNR। – Durandal

2

पॉइंटर का आकार उस स्मृति को सीमित करेगा जो आप एक्सेस करने में सक्षम हैं। यहां तक ​​कि यदि हार्डवेयर असीमित मेमोरी के लिए समर्थन प्रदान करता है, यदि आप सबसे बड़ा डेटाटाइप उपयोग करने में सक्षम हैं, तो 64 बिट है, तो आप केवल 2^64 बाइट्स मेमोरी तक पहुंच पाएंगे।

0

मैं एक सरणी के लिए अधिकतम आकार निर्धारित करने का एक तरीका ढूंढ रहा था। यह सवाल ऐसा ही प्रतीत होता है, इसलिए मैं अपने निष्कर्ष साझा करना चाहता हूं।

प्रारंभ में, सी संकलन समय में किसी सरणी में आवंटित तत्वों की अधिकतम संख्या निर्धारित करने के लिए कोई फ़ंक्शन प्रदान नहीं करता है। ऐसा इसलिए है क्योंकि यह मशीन में उपलब्ध स्मृति की निर्भर करेगा जहां इसे निष्पादित किया जाएगा।

दूसरी ओर, मुझे पता चला है कि स्मृति आवंटन कार्य (calloc() और malloc()) बड़े सरणी आवंटित करने में सक्षम हैं। इसके अलावा, ये फ़ंक्शंस आपको रनटाइम मेमोरी आवंटन त्रुटियों को संभालने की अनुमति देता है।

उम्मीद है कि मदद करता है।

6

C99 5.2.4.1 "अनुवाद सीमा" न्यूनतम आकार

कार्यान्वयन का अनुवाद करने और कम से कम एक प्रोग्राम है जो निम्नलिखित सीमा में से हर एक की कम से कम एक उदाहरण में शामिल है निष्पादित करने में सक्षम हो जाएगा: 13) एक वस्तु में

  • 65535 बाइट (एक की मेजबानी की पर्यावरण केवल)

13) क्रियान्वयन shou में जब भी संभव हो, निश्चित अनुवाद सीमा लागू करने से बचें।

यह बताता है कि एक अनुरूप कार्यान्वयन short बाइट्स के साथ किसी ऑब्जेक्ट (जिसमें सरणी शामिल है) को संकलित करने से इंकार कर सकता है।

9 जब दो संकेत घटाया जाता है, दोनों को इंगित करेगा:

PTRDIFF_MAX स्थिर सरणी के लिए एक व्यावहारिक सीमा वस्तुओं

C99 मानक 6.5.6 Additive ऑपरेटरों कहते हो रहा है उसी सरणी ऑब्जेक्ट के तत्व, या सरणी ऑब्जेक्ट के अंतिम तत्व से पहले एक; नतीजा दो सरणी तत्वों की सबस्क्रिप्ट का अंतर है। परिणाम का आकार कार्यान्वयन-परिभाषित है, और इसके प्रकार (एक हस्ताक्षरित पूर्णांक प्रकार) <stddef.h> शीर्षलेख में परिभाषित है। यदि परिणाम उस प्रकार की किसी वस्तु में प्रतिनिधित्व योग्य नहीं है, तो व्यवहार अपरिभाषित है।

जो मेरा तात्पर्य है कि ptrdiff_t से बड़े सरणी सिद्धांत में अनुमत हैं, लेकिन फिर आप पोर्टेबल रूप से उनके पते का अंतर नहीं ले सकते हैं।

तो शायद इस कारण से, जीसीसी आपको ptrdiff_t तक सीमित कर रहा है। यह भी उल्लेख किया गया है: Why is the maximum size of an array "too large"?

मैं अनुभव main.c के साथ इस सत्यापित कर ली है

#include <stdint.h> 

uint8_t a[(X)]; 

int main(void) { 
    return 0; 
} 

और फिर Ubunbu 17 में।10:

$ arm-linux-gnueabi-gcc --version 
arm-linux-gnueabi-gcc (Ubuntu/Linaro 7.2.0-6ubuntu1) 7.2.0 
Copyright (C) 2017 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

$ printf ' 
> #include <stdint.h> 
> PTRDIFF_MAX 
> SIZE_MAX 
> ' | arm-linux-gnueabi-cpp | tail -n2 
(2147483647) 
(4294967295U) 
$ PTRDIFF_MAX == 2147483647 == 2^31 - 1 
$ 
$ # 2lu << 30 == 2^31 == PTRDIFF_MAX + 1 
$ arm-linux-gnueabi-gcc -std=c99 -DX='(2lu << 30)' main.c 
a.c:5:9: error: size of array ‘a’ is too large 
uint8_t a[(X)]; 
     ^
$ 
$ # PTRDIFF_MAX 
$ arm-linux-gnueabi-gcc -std=c99 -DX='(2lu << 30) - 1lu' main.c 
$ 

भी

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