2012-11-16 7 views
7

Ich verwende Marshal.GlobalHAlloc, um Speicher zuzuweisen. In der Dokumentation heißt es: "Diese Methode macht die Win32 LocalAlloc-Funktion von Kernel32.dll verfügbar." GlobalAlloc 's Dokumentation sagt, es wird 8 Byte ausgerichtet sein, aber LocalAlloc nichts über Ausrichtung sagen.Wie Speicher mit einer 16-Byte-Ausrichtung zuweisen?

Zum Beispiel möchte ich 1024 Bytes zuweisen und sicherstellen, dass es um 16 ausgerichtet ist. Wird es funktionieren, wenn ich 1024 + 16 Bytes zuordnen dann überprüfe ich Zeiger% 16? Wenn das Ergebnis 0 ist, bedeutet dies, dass der Speicher ausgerichtet ist. Wenn es nicht 0 ist, werde ich den Zeiger nur erhöhen, um meinen Erwartungen zu entsprechen. Das Problem ist, ich weiß nicht, wenn ich einen ausgerichteten Zeiger habe, ist es wirklich im physischen Speicher ausgerichtet?

Antwort

10

Alle Windows-Heap Verteilern ausrichten, indem 8. Sie können das Problem beheben, indem Über Aufteilung und Einstellung des Zeigers, wie folgt aus:

var rawptr = Marshal.AllocHGlobal(size + 8); 
    var aligned = new IntPtr(16 * (((long)rawptr + 15)/16)); 
    // Use aligned 
    //... 
    Marshal.FreeHGlobal(rawptr); 
Verwandte Themen