Ausrichtung entlang der 4-byte-Grenzen

Hab ich neulich nachdenken über die Ausrichtung... Es ist etwas, dass wir normalerweise nicht denken müssen, aber ich habe erkannt, dass einige Prozessoren erfordern Objekte werden ausgerichtet auf 4-byte-Grenzen. Was genau bedeutet das, und welche spezifischen Systeme alignment-Anforderungen?

Angenommen ich habe ein beliebiger Zeiger:

unsigned char* ptr

Nun, ich bin versucht zu rufen Sie einen double-Wert aus einem Speicherbereich:

double d = **((double*)ptr);

Wird das Probleme verursachen?

Beachten Sie, dass Doppelzimmer sehr gut haben können sizeof(double) Ausrichtung, die wiederum einen > 4. Und Typen mit sizeof(T)<4 nie Ausrichtungen auf 4-byte-Grenzen - anders konnte man Sie nicht, richten Sie beide Elemente von T[2] !
Ich versuche mir vorzustellen, welche Art von Programm-design brauchen würden, um Sie zu Lesen, verdoppelt sich von unaligned beliebigen Zeiger. Ich kann nicht glauben, eine praktische Szenario-zumindest für ein Szenario, es gibt bessere Lösungen, die nicht mit Problemen Ausrichtung und sind eher für die cross-Plattform-Codierung.
Solange ptr-Punkte auf dynamisch allokierten Speicher, es wird funktionieren. Wenn ptr Punkte bei einem statischen array (globalen oder lokalen), dann gibt es keine Garantien. (siehe meine Antwort weiter unten für details)
Können wir die Zeiger der Ausrichtung auf eine 4-byte-Grenze in einer effizienten Art und Weise ?
Die Sache zu beachten hier ist, dass einige ISAs (z.B. x86) erlauben es Ihnen, laden, Speicher in einem 32-bit-register mit einer Adresse, die nicht 32-bit-ausgerichtet mit einem normalen load-Anweisung. Die meisten RISC ISAs nicht, und verlangen, dass der compiler emittieren zusätzliche Anweisungen, um 2 Lasten plus einige bit-twiddling für alle Daten, die beiderseits der Grenze. Es werden in der Regel nicht gut (best-case) auf jeder Art von Architektur, vorausgesetzt, der compiler erkennt die situation. Wenn der compiler nichts von den unaligned access (worst-case), dann wird es funktionieren auf x86, andere aber nicht.

InformationsquelleAutor Tony the Pony | 2009-08-06

Schreibe einen Kommentar