2010-07-28 5 views
6

सी या सी ++ कोड का उपयोग कर मेमोरी पेज आकार का पता लगाने (प्रोग्रामेटिक रूप से) करने का कोई पोर्टेबल तरीका है?मेमोरी पेज आकार का पता लगाने

+8

नहीं, नहीं है। –

+3

कोई ऐसा नहीं है क्योंकि वर्चुअल मेमोरी के बिना प्लेटफॉर्म के लिए सी और सी ++ भी मौजूद हैं। – zvrba

उत्तर

9

Boost जब से तुम स्मृति पेज आकार को पुनः प्राप्त करने mapped_region::get_page_size() समारोह इस्तेमाल कर सकते हैं एक बहुत पोर्टेबल पुस्तकालय है।

सी ++ मानक के लिए यह ऐसी कोई संभावना नहीं देता है।

8

सी स्मृति पृष्ठों के बारे में कुछ भी नहीं जानता है। POSIX सिस्टम पर आप उपयोग कर सकते हैं long pagesize = sysconf(_SC_PAGE_SIZE);

1

यह पूरी तरह से मंच निर्भर है जो पता-श्रेणी को पेज-आकार के लिए मैप किया जाता है। आगे पेजसाइज सिस्टम-व्यापी नहीं है। आप उपयोग के मामले के अनुसार विभिन्न पेज-आकार क्षेत्रों से स्मृति आवंटित कर सकते हैं। और आप वर्चुअल मेमोरी मैनेजमेंट के बिना प्लेटफॉर्म भी ले सकते हैं।

तो, इस विषय को संभालने वाला कोड मंच विशिष्ट होना चाहिए।

+0

अपनी व्याख्या और निष्कर्ष के बीच डिस्कनेक्ट करें; एक ही तर्क लागू करने से हमें पता चलेगा कि एक सूचक का आकार निर्धारित करना प्लेटफॉर्म विशिष्ट है। – kfsone

-3

मुझे लगता है कि यह फ़ंक्शन मदद करता है।
[DllImport ("kernel32.dll")] सार्वजनिक स्थैतिक बाहरी शून्य GetSystemInfo ([मार्शलएएस (UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);

+2

प्रश्न कहता है 'सी', 'सी ++' और 'पोर्टेबल' और इसके शीर्ष पर आप यह भी वर्णन नहीं करते कि इसका वर्णन पृष्ठ के आकार से कैसे प्राप्त किया जाए। – kfsone

3

हां, यह प्लेटफार्म-विशिष्ट है। लिनक्स पर sysconf(_SC_PAGESIZE) है, जो कि पॉज़िक्स भी लगता है। सहायक सी पुस्तकालय सहायक वेक्टर का उपयोग करके इसे लागू करता है। किसी कारण से आप एक सी पुस्तकालय नहीं है, तो या सहायक वेक्टर आप इस तरह पृष्ठ आकार निर्धारित कर सकते हैं:

size_t get_page_size(void) 
{ 
    size_t n; 
    char *p; 
    int u; 
    for (n = 1; n; n *= 2) { 
     p = mmap(0, n * 2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 
     if (p == MAP_FAILED) 
      return -1; 
     u = munmap(p + n, n); 
     munmap(p, n * 2); 
     if (!u) 
      return n; 
    } 
    return -1; 
} 

भी POSIX है यही कारण है कि, मुझे लगता है। यह कुछ मुफ्त मेमोरी होने पर निर्भर करता है, लेकिन इसे केवल दो लगातार पृष्ठों की आवश्यकता है। यह कुछ (अजीब) परिस्थितियों में उपयोगी हो सकता है।

0

ऑपरेटिंग सिस्टम के पार, नहीं।

Linux सिस्टम पर:

#include <unistd.h> 
long sz = sysconf (_SC_PAGESIZE);