2012-02-12 11 views
5

सी ++ में जब मैं new (या यहां तक ​​कि मॉलोक) करता हूं तो क्या कोई गारंटी है कि वापसी पता एक निश्चित मूल्य से अधिक होगा? क्योंकि ... इस प्रोजेक्ट में मुझे यह पता चलता है कि हर साल 0-1k को एनम के रूप में उपयोग करना उपयोगी होता है। लेकिन मैं ऐसा नहीं करना चाहूंगा यदि कम मूल्य प्राप्त करना संभव हो। ओएस विंडो/लिनक्स और मैक के साथ मेरा एकमात्र लक्ष्य सिस्टम 32 या 64 बिट CPUs है।क्या पॉइंटर गारंटी है> एक निश्चित मूल्य?

क्या मानक पॉइंटर्स के बारे में कुछ भी कहता है? क्या विंडोज या लिनक्स अपने सी रनटाइम के बारे में कुछ भी कहता है और सबसे कम स्मृति पता (राम के लिए) क्या है?

-edit- मैं पता लगाने के लिए अपना new अधिभार संशोधित करना चाहता हूं कि पता ऊपर है> 1k। मैं std :: समाप्त करता हूं अगर यह नहीं करता है।

+1

आप एनमर्स को पॉइंटर्स के रूप में क्यों उपयोग कर रहे हैं? – Pubby

+1

@ पब्बी: यह सामान्य है (विशेष रूप से दुभाषियों और खेलों में) प्लेटफार्म-विशिष्ट पॉइंटर विशेषताओं पर निर्भर रहने के लिए, आमतौर पर संकेतों को खत्म करने के लिए, उन्हें अतिरिक्त जानकारी प्रदान करने के लिए।संरेखण नियमों के कारण, नीचे तीन बिट मुक्त हैं; इसके अतिरिक्त, 64-बिट सिस्टम में आमतौर पर केवल 48 महत्वपूर्ण बिट्स वाले उपयोगकर्ता स्पेस पॉइंटर्स होते हैं; शेष सभी '1' या' 0' हैं, इसलिए आप 'NaN' का प्रतिनिधित्व करने के लिए सेट अपर बिट्स के साथ 'डबल' के (53-बिट) मंटिसा में एक पॉइंटर पैक कर सकते हैं। फिर कम ऑर्डर झंडे आपको मास्किंग और स्थानांतरण के साथ प्रस्तुतियों के बीच जल्दी से चुनने देते हैं। –

+0

ऐसा प्रतीत होता है कि मुझे केवल 6 बिट्स की आवश्यकता है इसलिए मुझे पहले 1 या 4k की आवश्यकता नहीं होगी :)। –

उत्तर

4

ऐसी कोई गारंटी नहीं है। यदि आपको बहुत विशिष्ट मेमोरी स्थानों की आवश्यकता है तो आप placement new का उपयोग करने का प्रयास कर सकते हैं, लेकिन इसमें कुछ समस्याएं हैं जिनके पास आपको work hard to avoid होना होगा। आप एक पूर्णांक कुंजी वाले मानचित्र का उपयोग करने का प्रयास क्यों नहीं करते जिसके पास पॉइंटर इसके मूल्य के रूप में है? इस तरह आपको विशिष्ट स्मृति पते और श्रेणियों पर भरोसा नहीं करना पड़ेगा।

2

सिद्धांत रूप में, नहीं - एक सूचक की भी गारंटी नहीं है> 0. हालांकि, व्यावहारिक रूप से, एक हस्ताक्षरित पूर्णांक के रूप में देखा जाता है (यह न भूलें कि एक सूचक के पास उच्च आदेश "1" बिट हो सकता है) कोई भी प्रणाली जिसे मैं जानता हूं उसके पास सूचकांक मूल्य लगभग 1000 से कम होगा। लेकिन उस पर भरोसा करना "अपरिभाषित व्यवहार" पर निर्भर है।

+1

संदर्भ? मुझे लगता है कि मुझे याद है कि लिनक्स वर्चुअल मेमोरी में पहला 1 जीबी केवल कर्नेल के लिए है, [इसलिए यदि यह सच है, तो आपके आवेदन को पहले 1 जीबी में कोई पता नहीं मिलेगा, जब तक यह कर्नेल मोड पर नहीं चलता] हालांकि, मैं हो सकता हूं शुरुआती धारणा के बारे में गलत, मुझे याद नहीं है कि मुझे लगता है कि मैंने इसे कहाँ पढ़ा है: \ – amit

+0

@amit my google-fu इस http://linux-mm.org/HighMemory "उपयोगकर्ता प्रोग्राम के लिए 3 जीबी और कर्नेल के लिए 1 जीबी" –

+0

@amit - मैं बहुत आम बात कर रहा था - सी ++ कुछ सुंदर छोटी प्रणालियों पर चलता है। –

1

वैध स्मृति पते कहां से आते हैं इसके लिए कोई मानक नहीं है; सुरक्षित सिस्टम-स्वतंत्र कोड लिखने के लिए, आप कुछ पतों पर भरोसा नहीं कर सकते (और यहां तक ​​कि अनावश्यक समर्थन के साथ, आप कभी नहीं जानते कि यह एक नए सिस्टम अपडेट के साथ कब बदल जाएगा)।

6

मानक के मामले में, कुछ भी नहीं है। लेकिन हकीकत में, यह लक्ष्य ओएस पर निर्भर करता है, उदाहरण के लिए विंडोज़ पहली 64 केबी मेमोरी को नो-मॉन्स भूमि के रूप में सुरक्षित करती है (निर्माण के आधार पर यह केवल पढ़ने योग्य स्मृति है, अन्यथा इसे PAGE_NOACCESS के रूप में चिह्नित किया जाता है), जबकि यह उपयोग करता है कर्नेल मेमोरी के लिए ऊपरी 0x80000000 +, लेकिन इसे बदला जा सकता है, this & this एमएसडीएन पर देखें।

x64 पर आप पते के ऊंचे बिट्स का उपयोग भी कर सकते हैं (वर्तमान में केवल 47 बिट्स पते के लिए उपयोग किए जाते हैं), लेकिन यह इतना अच्छा विचार नहीं है, क्योंकि बाद में यह बदल जाएगा और आपका प्रोग्राम टूट जाएगा (एएमडी जो सेट करता है मानक इसके खिलाफ भी सलाह देते हैं)।

+0

अच्छा उत्तर +1। –

1

यह बहुत प्लेटफ़ॉर्म-विशिष्ट है, इसलिए जब तक आप एक बहुत अच्छा कारण है और पोर्टेबिलिटी के लिए परिणाम, रख-रखाव आदि

शून्य 0x0 हमेशा होने की गारंटी है के बारे में पता कर रहे हैं मैं इस प्रकार की जानकारी पर भरोसा दूंगी। अगर मुझे सही ढंग से याद किया जाता है, तो x86 पहले 128 एमबी एड्रेस स्पेस को "न्यूल-समकक्ष" के रूप में सुरक्षित करता है, ताकि मान्य पॉइंटर्स इस श्रेणी में मूल्यों को नहीं ले सकें। X64 पर कुछ additional addresses हैं जिन्हें कम से कम अभी तक अभ्यास में नहीं सामना करना चाहिए।

ऑपरेटिंग सिस्टम के लिए आरक्षित पता स्थान के लिए, यह स्पष्ट रूप से ओएस पर निर्भर करेगा। लिनक्स पर, कर्नेल-उपयोगकर्ता स्पेस डिवीजन कर्नेल में कॉन्फ़िगर करने योग्य है, इसलिए कम से कम 3 विभाजन: 1-3 जीबी, 2-2 जीबी और 3-1 जीबी 32-बिट सिस्टम पर आम हैं। आप अधिक जानकारी on kerneltrap पा सकते हैं।

+0

निश्चित रूप से आप पता स्थान के पहले 128 * के * बी का मतलब था? –

+0

@ कोडीग्रे नहीं, यह वास्तव में 128 एमबी है, केबी नहीं। लेकिन मैं कारणों के बारे में बिल्कुल सही नहीं था। यह सीपीयू के कारण नहीं बल्कि बल्कि यूनिक्स जैसी प्रणालियों पर अनुप्रयोगों के पता स्थान के लेआउट के कारण होता है। 0-128 एमबी क्षेत्र स्टैक के लिए आरक्षित है, जिसका अर्थ है कि आपको 'new' या' malloc() 'का उपयोग करते समय इस सीमा से पते नहीं मिलते हैं जो ढेर से स्मृति आवंटित करते हैं। यह [इस अच्छा जवाब] में बहुत अच्छी तरह से समझाया गया है (http://stackoverflow.com/a/2187753/1224016)। –

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