2012-11-16 11 views
7

मैं स्मृति आवंटित करने के लिए Marshal.GlobalHAlloc का उपयोग करता हूं। जैसा कि प्रलेखन कहता है: "यह विधि Win32 LocalAlloc फ़ंक्शन को कर्नेल 32.dll से उजागर करती है।"। GlobalAlloc के दस्तावेज का कहना है कि यह 8 बाइट गठबंधन होगा लेकिन LocalAlloc संरेखित करने के बारे में कुछ भी मत कहो।16 बाइट संरेखण के साथ स्मृति आवंटित कैसे करें?

उदाहरण के लिए मैं 1024 बाइट आवंटित करना चाहता हूं और सुनिश्चित करता हूं कि यह 16 तक गठबंधन है। क्या यह काम करेगा जब मैं 1024 + 16 बाइट आवंटित करता हूं तो मैं सूचक% 16 जांचता हूं? यदि परिणाम 0 है तो इसका मतलब है कि मेमोरी गठबंधन है, जब यह 0 नहीं है, तो मैं अपनी उम्मीदों को पूरा करने के लिए पॉइंटर बढ़ाता हूं। समस्या यह है कि मुझे नहीं पता, अगर मैंने संकेतक को गठबंधन किया है तो यह वास्तव में भौतिक स्मृति में गठबंधन है?

उत्तर

10

सभी विंडोज ढेर allocators 8. द्वारा संरेखित आपको लगता है कि द्वारा ठीक कर सकते हैं पर-आवंटन और सूचक को एडजस्ट करने, इस तरह:

var rawptr = Marshal.AllocHGlobal(size + 8); 
    var aligned = new IntPtr(16 * (((long)rawptr + 15)/16)); 
    // Use aligned 
    //... 
    Marshal.FreeHGlobal(rawptr); 
संबंधित मुद्दे