2013-04-15 8 views
5

क्या कोई भी इस वाक्य का अनुवाद किसी भी व्यक्ति के लिए अप्रबंधित कोड और स्मृति प्रबंधन की जटिलताओं से अनजान है?बफर को 64 KB आकार में प्रक्रिया के लिए साझा ढेर से आवंटित किया गया है?

इस बफर के लिए भंडारण प्रक्रिया है कि आकार में 64 केबी के लिए एक साझा ढेर से आवंटित है। बफर का अधिकतम आकार ढेर उपयोग पर निर्भर करेगा।

यह कुछ दर्जन एमएसडीएन पृष्ठों पर मौजूद है, उदाहरण के लिए WriteConsole, लेकिन मुझे कोई एपीआई नहीं मिल रहा है जो अधिकतम आकार की गणना करेगा, इस तरह के सरणी को उड़ने से पहले होने की अनुमति है, अनुभवजन्य से मैं इसे 61 और 62.5 केबी के बीच कहीं कह सकता हूं (64, 63, 62 आदि को कॉल करके जब तक यह सेटिंग बंद नहीं हो जाता DllImport का SetLastError)। क्या GetTotalHeapSize जैसी कोई चीज है (यदि यह विंडोज संस्करण, प्लेटफार्म आर्किटेक्चर, डिफॉल्ट इत्यादि से स्वतंत्र 64 केबी नहीं है) और GetCurrentHeapInUse जैसी कुछ उपलब्ध है? मैं अधिकतम बाइट कैसे प्राप्त करूं जो मैं उस और अन्य पी/आमंत्रण विधियों को पास कर सकता हूं?

+0

यहां एक झटका है। ढेर 64k सीमा पर होने की संभावना है। यदि ऐसा है, तो 'myptr = malloc (1)' पर कॉल करें और 'myptr और 0xFFFF' के मान का निरीक्षण करें। यह उपयोग की जाने वाली जगह की मात्रा के बहुत करीब होगा - शेष राशि उस संख्या के लगभग 64k से कम होगी। – Floris

उत्तर

4

यह कैसे काम करता है ढेर नहीं है। वे आपके द्वारा किए जा सकने वाले सबसे बड़े आवंटन का ट्रैक नहीं रखते हैं। यह अप्रत्याशित है क्योंकि एक ढेर खंडित हो सकता है। नि: शुल्क ब्लॉक आवंटित लोगों के साथ interleaved किया जा सकता है। एक छोटे आवंटन को जारी करने से उदाहरण के लिए अचानक उपलब्ध स्थान दोगुना हो सकता है। अप्रबंधित ढेर में एक प्रबंधित ढेर की लक्जरी नहीं है, वे संकुचित नहीं हो सकते हैं। यद्यपि .NET बड़े ऑब्जेक्ट हीप में भी यह समस्या है। सबसे बड़ी उपलब्ध जगह को मापने के लिए कोई कार्य नहीं है, यह थ्रेड-सुरक्षित बनाना असंभव है।

आप कुछ भी नहीं कर सकते हैं लेकिन को आवंटित करने और परिणामों के साथ निपटने के लिए प्रयास करें यदि आप नहीं कर सकते हैं।

+1

धन्यवाद, मुझे यह अजीब लगता है कि एक दर्जन सार्वजनिक एपीआई हैं जिन्हें अज्ञात लंबाई के सरणी परम की आवश्यकता होती है, या 64 -बी-से-कम-से-कम-निश्चित-निश्चित-कितना-कम विशिष्ट होना आवश्यक है। क्या मैं यह मानने में सही हूं कि यद्यपि 61kb सरणी मेरी मशीन पर काम करती है अगर मैं 60kb हार्डकोड करता हूं, फिर भी यह अन्य उपकरणों/प्लेटफॉर्म पर काम करने की गारंटी नहीं देता है? और [HeapQueryInformation] (http://msdn.microsoft.com/library/aa366703.aspx) और [हेपसाइज] (http://msdn.microsoft.com/library/aa366706.aspx) फ़ंक्शंस केवल उपयोगी है लेकिन मदद नहीं करेगा उस जादू को बाइट्स की सटीक संख्या प्राप्त करने के लिए? –

+1

यह ढेर एक असामान्य है। यह कंसोल के लिए एक कार्यान्वयन विस्तार है और बिल्कुल खुलासा नहीं है। इसके बारे में आपने एकमात्र कारण सुना है क्योंकि यह इतना छोटा है कि माइक्रोसॉफ्ट को सामान्य त्रुटियों को समझाने के लिए इसके बारे में कुछ कहना पड़ा। कंसोल एपीआई इस तरह से quirky है। अफैइक यह एक हल समस्या है वैसे भी, यह प्रतिबंध केवल पुराने विंडोज संस्करणों में मौजूद है। करने की संभावना है कि सीमा को धक्का देने की कोशिश न करें। WriteConsole छोटे बफर के साथ ही काम करेगा। –

+0

'वैसे भी हल' से आपका क्या मतलब है? यहां एक प्रबंधित स्निपेट है जो नवीनतम ओएस/हार्डवेयर पर 'पर्याप्त भंडारण उपलब्ध नहीं है' के साथ उड़ रहा है ... 'कंसोल। विन्डोहेइट = 100; Console.BufferWidth = 1000; Console.MoveBufferArea (0, 0, Console.BufferWidth, 16, 0, 0); ' –

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