2013-02-21 104 views
6

क्या मानक सी ++ 11 में क्रैश किए बिना सिस्टम (x86, x64, PowerPC/Windows, Linux या MacOS) पर शेष उपलब्ध स्मृति प्राप्त करना संभव है?शेष उपलब्ध स्मृति को मानक C++ 11 में प्राप्त करें?

बहुत ही बड़े आकार से शुरू होने वाले बहुत बड़े सरणी आवंटित करने का प्रयास करने का एक बेवकूफ तरीका होगा, हर बार विफल होने पर अपवादों को पकड़ने और आकार को कम करने तक कोई अपवाद नहीं फेंक दिया जाता है। लेकिन शायद एक और अधिक कुशल/चालाक विधि है ...

संपादित करें 1: वास्तव में मुझे स्मृति की सटीक मात्रा की आवश्यकता नहीं है। मैं लगभग (100 एमबी की त्रुटि पट्टी) जानना चाहता हूं) जब मैं इसे शुरू करता हूं तो मेरा कोड कितना उपयोग कर सकता है।

संपादित करें 2: इस कोड के बारे में आप क्या सोचते हैं? क्या यह मेरे प्रोग्राम की शुरुआत में इसे चलाने के लिए सुरक्षित है या यह स्मृति को दूषित कर सकता है?

#include <iostream> 
#include <array> 
#include <list> 
#include <initializer_list> 
#include <stdexcept> 

int main(int argc, char* argv[]) 
{ 
    static const long long int megabyte = 1024*1024; 
    std::array<char, megabyte> content({{'a'}}); 
    std::list<decltype(content)> list1; 
    std::list<decltype(content)> list2; 
    const long long int n1 = list1.max_size(); 
    const long long int n2 = list2.max_size(); 
    long long int i1 = 0; 
    long long int i2 = 0; 
    long long int result = 0; 
    for (i1 = 0; i1 < n1; ++i1) { 
     try { 
      list1.push_back(content); 
     } 
     catch (const std::exception&) { 
      break; 
     } 
    } 
    for (i2 = 0; i2 < n2; ++i2) { 
     try { 
      list2.push_back(content); 
     } 
     catch (const std::exception&) { 
      break; 
     } 
    } 
    list1.clear(); 
    list2.clear(); 
    result = (i1+i2)*sizeof(content); 
    std::cout<<"Memory available for program execution = "<<result/megabyte<<" MB"<<std::endl; 
    return 0; 
} 
+0

क्षमा करें, इस बार "शायद" के दो संभावित परिणामों में से "नहीं" बाहर आ गया है। –

+0

यह अत्यधिक मंच निर्भर है, और मानक में निपटा नहीं है। –

+0

ऐसा करने के लिए कोई "मानक" तरीका नहीं है। यहां तक ​​कि आपके द्वारा वर्णित विधि वैध परिणाम नहीं दे सकती है। आपको प्लेटफ़ॉर्म-विशिष्ट कार्यक्षमता का उपयोग करना होगा। –

उत्तर

8

यह ओएस/मंच पर अत्यधिक निर्भर है। आपके द्वारा सुझाए गए दृष्टिकोण को वास्तविक जीवन में भी काम करने की आवश्यकता नहीं है। कुछ प्लेटफॉर्म में ओएस आप अपने सभी स्मृति अनुरोधों को स्वीकार करेंगे, लेकिन वास्तव में नहीं जब तक आप इसका इस्तेमाल जाएँ, जिसके बाद आप एक SEGFAULT मिल आप स्मृति दे ...

मानक है नहीं कुछ भी संबंधित है इसके लिए।

+0

सेगफॉल्ट संभावित परिणाम नहीं होगा। मैक ओएस एक्स पर, प्रक्रिया निलंबित कर दी जाएगी। किसी भी मामले में, मशीन आमतौर पर पहले "थ्रैश" शुरू कर देगी। – Potatoswatter

+0

@Potatoswatter: एक लिनक्स बॉक्स आज़माएं, स्वैप फ़ाइल को हटाएं, एक बड़ी पर्याप्त गतिशील सरणी आवंटित करें और प्रत्येक मेमोरी पेज को छूने के लिए 4096 वें बाइट कहें, प्रत्येक को छूएं। कम से कम अतीत में यह अंततः एक SEGFAULT –

+0

@ डेविडरोड्रिगुएज़-ड्राईबीस के साथ मर जाएगा - यह लिनक्स है, ओएसएक्स अलग है। जैसा कि आपने कहा था, यह "अत्यधिक निर्भर" है। मुख्य बिंदु यह है कि कुछ प्रणालियों पर कोई वर्चुअल मेमोरी में भी उपलब्ध होने की तुलना में कहीं अधिक स्मृति को सफलतापूर्वक आवंटित कर सकता है, जहां "सफलता" का अर्थ नए से कोई फेंक नहीं है, या मॉलोक से गैर-शून्य सूचक है। समस्या तब तक दिखाई नहीं दे सकती जब तक कि स्मृति की फर्जी मात्रा को सफलतापूर्वक आवंटित नहीं किया गया हो। –

2

ऐसा लगता है कि उत्तर नहीं है, आप इसे मानक C++ में नहीं कर सकते हैं।

इसके बजाय आप क्या कर सकते हैं How to get available memory C++/g++? और वहां से जुड़ी सामग्री के तहत चर्चा की जा सकती है। वे सभी मंच विशिष्ट सामान हैं। यह मानक नहीं है लेकिन कम से कम यह आपको उस समस्या को हल करने में मदद करता है जिसके साथ आप काम कर रहे हैं।

1

जैसा कि अन्य ने उल्लेख किया है, समस्या को ठीक से परिभाषित करना मुश्किल है, बहुत कम हल। हार्ड डिस्क पर वर्चुअल मेमोरी "उपलब्ध" के रूप में गिनती है? इस बारे में क्या है कि सिस्टम अधिक हार्ड डिस्क स्थान प्राप्त करने के लिए फ़ाइलों को हटाने के लिए एक प्रॉम्प्ट लागू करता है, इस बीच आपके प्रोग्राम को निलंबित कर रहा है? (यह ओएस एक्स पर बिल्कुल होता है।)

सिस्टम शायद मेमोरी पदानुक्रम लागू करता है जो आप जितना अधिक उपयोग करते हैं उतना धीमा हो जाता है। आप सी alarm इंटरप्ट सुविधा या clock या localtime/mktime, या सी ++ 11 घड़ी सुविधाओं का उपयोग करते समय स्मृति के हिस्सों को आवंटित और प्रारंभ करके रैम और डिस्क के बीच प्रदर्शन चट्टान का पता लगाने का प्रयास कर सकते हैं। वॉल-घड़ी का समय जल्दी से गुजरना चाहिए क्योंकि मशीन कम कुशल संसाधनों से स्मृति प्राप्त करने के तनाव में धीमा हो जाती है। (लेकिन यह धारणा बनाता है कि यह किसी अन्य प्रक्रिया जैसे किसी अन्य चीज से तनाव नहीं उठाता है।) आप उपयोगकर्ता को यह बताना चाहते हैं कि प्रोग्राम क्या प्रयास कर रहा है, और परिणामों को संपादन योग्य कॉन्फ़िगरेशन फ़ाइल में सहेजता है।

1

मैं इसके बजाय कॉन्फ़िगर करने योग्य अधिकतम मात्रा में स्मृति का उपयोग करने की सलाह दूंगा। चूंकि कुछ प्लेटफ़ॉर्म ओवरमिटिट मेमोरी हैं, इसलिए यह बताने में आसान नहीं है कि आपको वास्तव में कितनी मेमोरी तक पहुंच होगी। यह मानने के लिए विनम्र भी नहीं है कि आपके पास 100% स्मृति उपलब्ध है, कई प्रणालियों में अन्य प्रोग्राम चलेंगे।

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

  • कोई संबंधित समस्या नहीं^_^