2012-11-16 21 views
7

Tôi sử dụng Marshal.GlobalHAlloc để cấp phát bộ nhớ. Như tài liệu nói: "Phương pháp này cho thấy các Win32 LocalAlloc chức năng từ Kernel32.dll.". GlobalAlloc 's tài liệu nói rằng nó sẽ được 8 byte liên kết nhưng LocalAlloc không nói bất cứ điều gì về sắp xếp.Làm thế nào để cấp phát bộ nhớ với sự liên kết 16 byte?

Ví dụ tôi muốn phân bổ 1024 byte và đảm bảo nó được căn chỉnh theo 16. Nó sẽ hoạt động khi tôi phân bổ 1024 + 16 byte sau đó tôi kiểm tra con trỏ% 16? Nếu kết quả là 0 nó có nghĩa là bộ nhớ được liên kết, khi nó không phải là 0, tôi chỉ cần tăng con trỏ để phù hợp với mong đợi của tôi. Vấn đề là tôi không biết, nếu tôi đã liên kết con trỏ nó thực sự là phù hợp trong bộ nhớ vật lý?

Trả lời

10

Tất cả Windows allocators đống sắp xếp bởi 8. Bạn có thể khắc phục điều đó bằng cách quá mức phân bổ và điều chỉnh con trỏ, như thế này:

var rawptr = Marshal.AllocHGlobal(size + 8); 
    var aligned = new IntPtr(16 * (((long)rawptr + 15)/16)); 
    // Use aligned 
    //... 
    Marshal.FreeHGlobal(rawptr); 
Các vấn đề liên quan