2010-05-10 11 views
7

nicht verwendet Ich bin ein Allzweck-Bibliothek zu entwickeln, die die verwendet Win32 HeapAllocWelche Ausrichtung HeapAlloc

MSDN nicht erwähnt Ausrichtung Garantien für Win32 des HeapAlloc, aber ich muss wissen, was wirklich Ausrichtung nutzt, so kann ich vermeiden, übermäßige Polsterung.

Auf meinem Computer (Vista, x86) sind alle Zuweisungen auf 8 Bytes ausgerichtet. Gilt das auch für andere Plattformen?

+6

Wenn MSDN es nicht sagt, dann * gibt es keine Garantie *. Selbst wenn du 1000 Leute fragst und sie alle feststellen, dass es 8 Bytes auf ihrer Maschine sind, ist das keine Garantie, und du solltest dich wahrscheinlich nicht darauf verlassen. –

+0

Ich stimme der obigen Aussage zu. Sie sollten sich vielleicht http://blogs.msdn.com/oldnewthing/archive/2007/12/27/6873648.aspx ansehen, um zu sehen, ob es relevant ist. – torak

+1

Ich stimme zu, es gibt keine Garantien, aber ich fordere hier keine Garantien: Ich frage nach Erfahrung. Ich bin zuversichtlich, Microsoft wird nie die Ausrichtung unter 8 Bytes verringern, weil Doppel nicht mehr lesbar sein wird. Ich würde es gerne wissen, das gilt auch für die Embedded-Plattformen. – Ondergetekende

Antwort

2

Die HeapAlloc Funktion, um die Ausrichtung Garantien in der MSDN-Seite ist nicht festgelegt, aber ich bin geneigt, die gleichen Garantien von GlobalAlloc zu denken, dass es haben sollte, die Speicher 8-Byte zurückzukehren ausgerichtet ist garantiert (wenn auch unter Berufung auf undokumentierten Funktionen ist böse); schließlich heißt es explizit, dass Global/LocalAlloc nur Wrapper um HeapAlloc sind (obwohl sie möglicherweise die ersten n Bytes verwerfen, um ausgerichteten Speicher zu bekommen - aber ich denke, dass es sehr unwahrscheinlich ist).

Wenn Sie wirklich sicher sein wollen, verwenden Sie einfach GlobalAlloc, oder sogar VirtualAlloc, dessen Granularität die Seitengranularität ist, die normalerweise 4 KB (IIRC) beträgt, aber in diesem Fall werden Sie viel verschwenden Erinnerung.

Übrigens, wenn Sie den neuen Operator C++ verwenden, wird garantiert, dass der Speicher für den von Ihnen angegebenen Typ korrekt ausgerichtet wird: das könnte der richtige Weg sein.

1

Die Ausrichtung wird so sein, dass die zurückgegebene Adresse in einen Zeiger eines beliebigen Typs umgewandelt werden kann. Andernfalls können Sie den Speicher in Ihrer Anwendung nicht verwenden.

+0

Wenn ich Ihre Antwort richtig verstanden habe, hängt die Tatsache, dass die zurückgegebene Adresse an einen Zeiger eines beliebigen Typs übergeben werden kann, nicht mit der Ausrichtung des zugewiesenen Speichers zusammen. –

+0

@Matteo: es ist verwandt. Wenn es nicht für einen Typ T ausgerichtet wäre, wäre eine Umwandlung in "T *" ungültig (es würde kompiliert werden, aber es würde nicht garantiert funktionieren). Da es in jeden Typ umgewandelt werden kann, muss es genau genug ausgerichtet sein, um mit jedem Typ zu arbeiten. – jalf

+0

Ok, ich habe deine Antwort auf andere Weise verstanden, also gilt das, was ich vorher gesagt habe, nicht; Trotzdem kann das Betriebssystem nicht garantieren, dass es für * any * -Typ ausgerichtet ist, sonst wäre nur ein NULL-Zeiger in Ordnung :). Wahrscheinlich ist es garantiert für den größten Typ zu arbeiten, der eine Ausrichtung erfordert, die Leuten bekannt ist, die den Zuordner geschrieben haben (oder zu dem größten Typ, der Ausrichtung erfordert, den die Leute, die den Zuweiser geschrieben haben, direkt unterstützen wollen). –

3

Überraschenderweise stellt sich Google up evidence dass HeapAlloc ist nicht immer SSE-konform:

HeapAlloc() hat alle Objekte immer 8 Byte ausgerichtet sind, egal, was ihre Größe ist (aber nicht 16 Byte ausgerichtet, für SSE).

Der Beitrag ist von Mitte 2008, was darauf hindeutet, dass die letzten Windows XP von diesem Fehler betroffen ist.

Siehe auch http://support.microsoft.com/kb/286470:

der Windows-Heap-Manager (alle Versionen) hat immer gewährleistet, dass die Heapzuweisungen eine Startadresse haben, die 8-Byte-ausgerichtet ist (auf 64-Bit-Plattformen die Ausrichtung 16- Bytes).

+0

Ja, SSE-Typen leben eine Art Schattenexistenz, bei der ihre Ausrichtung selten durch Zuordnungsfunktionen respektiert wird. Ich bin mir nicht sicher, warum, aber es scheint sowohl unter Windows als auch unter Linux der Fall zu sein. Standardmäßig erhalten Sie keine besseren Ausrichtungsgarantien als 8 Byte. – jalf

+0

@jalf: seltsam! Ich erinnere mich, dass 1999, als AltiVec eingeführt wurde, Apple die Zuweisungsfunktionen "NewPtr" und "NewHandle" für die 16-Byte-Ausrichtung sofort neu spezifizierte. Es ist nicht so, als ob man alte Software auf diese Weise bricht! – Potatoswatter