2016-04-27 8 views
0

Ich bin auf diese Seite The Lost Art of C Structure Packing gestoßen und während ich noch nie irgendwelche Strukturen strukturieren musste, würde ich gerne ein bisschen mehr lernen, so dass wenn ich es auch brauche - ich kann.Wo finde ich die Ausrichtungsanforderung für irgendeinen beliebigen Compiler?

Dort heißt es:

Lagerung für die grundlegenden C-Datentypen auf einem x86 oder ARM-Prozessor normalerweise nicht an beliebigen Byte-Adressen im Speicher starten. Vielmehr hat jeder Typ außer char eine Ausrichtungsanforderung; Zeichen können bei jeder Byte-Adresse beginnen, aber 2-Byte-Kurzschlüsse müssen bei einer geraden Adresse beginnen, 4-Byte-Ints oder Gleitkommazahlen müssen bei einer durch 4 teilbaren Adresse beginnen, und 8-Byte-Langs oder -Doppel müssen bei einer durch 8 teilbaren Adresse beginnen Signed oder Unsigned macht keinen Unterschied.

Bedeutet dies, dass alle 32-Bit-Prozessoren (x86, ARM, AVR32, PIC32, ...) diese Ausrichtungsanforderung haben? Was ist mit 16-Bit-Prozessoren?

Wenn nicht, und es ist gerätespezifisch, wo finde ich diese Informationen? Ich habe versucht, durch Microchip XC16 Manual gesucht, aber ich konnte die Ausrichtungsanforderungen nicht finden, die sagen, dass Ints an Adressen beginnen durch 4 teilbar

Ich gehe davon aus, dass die Informationen gibt, und ich bin nicht für die richtigen Schlüsselwörtern suchen - was ist die "Ausrichtungsanforderung" genannt, wenn ich online nach weiteren Informationen suchen würde?

+2

Eine Frage über "alle Hardware, Vergangenheit, Zukunft, spekulativ", ist ziemlich schwer zu beantworten. –

+0

@KerrekSB Der Jist von dem, was ich fragen, ist für, ist wirklich, wo kann ich die Informationen für jedes Gerät finden, wenn alle 32-Bit-Prozessoren nicht gleich ausgerichtet sind. Ist es in der Bedienungsanleitung? Wenn ja, nach welchen Begriffen oder nach welcher Terminologie müssen Sie suchen und wo? Klärt das Dinge auf? – efox29

+0

Ziemlich hart? Ich würde für unmöglich garantieren. Es ist Hardware und Implementierung abhängig. x86 zum Beispiel erlaubt beliebig ausgerichtete Lese-/Schreiboperationen, ein Compiler kann frei tun, was er will. Auf der anderen Seite erlaubt ARM keine beliebig ausgerichteten Zugriffe. – Leandros

Antwort

1

Alignments Anforderungen haben 2 Überlegungen: erforderlich,

bevorzugt

erforderlich: Beispiel: einige Plattformen erfordern verschiedene Arten, wie ein int ausgerichtet werden. Fehlerhafter Code, der versucht, auf eine nicht ausgerichtete Grenze auf einen int zuzugreifen, führt zu einem Fehler. Compiler richten Daten normalerweise automatisch aus, um dieses Problem zu vermeiden.

Effizienz: Unausgeglichene Zugriffe sind möglicherweise erlaubt, haben aber einen langsameren Code zur Folge. Viele Compiler werden, anstatt die Daten zu packen, standardmäßig ausgerichtete Daten für die Geschwindigkeit Effizienz verwenden. In der Regel erlauben solche Compiler ein Compiler-spezifisches Schlüsselwort oder eine Compiler-Option pack die Daten stattdessen für space Effizienz.

Diese Probleme gelten für verschiedene Prozessoren verschiedener Größen in unterschiedlichen Graden. Ein 8-Bit-Prozessor kann einen 16-Bit-Datenbus haben und 16+ -Bit-Typen zur Ausrichtung veranlassen. Ein kompatibler C-Compiler für einen 64-Bit-Prozessor kann haben nur haben 64-Bit-Typen, sogar char. Die Möglichkeiten sind riesig.


C stellt einen Integer-Typen max_align_t in <stddef.h>. Dies könnte auf verschiedene Arten verwendet werden, um die minimale allgemeine Ausrichtungsanforderung zu bestimmen.

... max_align_t, die einen Objekttyp, deren Ausrichtung ist, ist so groß, wie durch die Umsetzung in alle Kontexte unterstützt wird; ... C11 §7.19 2

C hat auch _Alignas(), um eine strengere Ausrichtung einer Variablen zu erzwingen.

0

Hier gibt es zwei globale Antworten.Ja, alle Prozessoren haben eine Ausrichtungsstrafe (ARM, MIPS, x86, usw.). Nein, Sie können nicht nach Typ bestimmen. Alle ARMs haben nicht den gleichen Alignment Penalty, obwohl sie glauben, dass sie etwas über den älteren ARMv4 und ARMv5 wissen, könnten Sie unzugeordnete Zugriffe auf eine vorhersehbare Art und Weise tun, so dass die meisten von uns nicht hätten vorhersehen können Aktivieren Sie es. MIPS und ARMs und vielleicht andere an einem Punkt würden eine strenge Strafe für nicht ausgerichtete Übertragungen haben, Sie würden einen Datenfehler bekommen. Aber aufgrund der Art, wie Programmierer programmieren, usw., ist der Standard zumindest für ARM, das auf einigen/neueren Kernen deaktiviert zu haben. Sie können es deaktivieren oder aktivieren, wie Sie wollen.

Alle Prozessoren haben eine Strafe für nicht ausgerichtete Übertragungen, eine Leistungseinbuße, und diese Treffer treten in den verschiedenen Schichten auf, manchmal im Kern, am Rand des Kerns, auf jeder Cache-Schicht und auf der äußeren Schicht von RAM . Da die Designs so unterschiedlich sind, kann man sich keine einzige Regel ausdenken.

Ebenso, da die Ausrichtung in Compilern implementiert ist, können Sie keinen portablen Code schreiben. Also, wenn Sie mit einem Prozessor (wahrscheinlich ein ARM, da das ist, wo die meisten Leute gebissen werden), die nicht ausgerichtete Fehler aktiviert hat, ist die tragbarste Lösung, aber nicht idiotensicher, zu starten Sie Ihre Strukturen mit den 64-Bit-Variablen, dann die 32 dann die 16 dann die 8. Compiler neigen dazu, Dinge in der Reihenfolge, die Sie sie definiert haben, zu platzieren, solange die gesamte Struktur an der rechten Grenze für das Ziel beginnt, dann werden die Variablen richtig ausgerichtet, keine Polsterung erforderlich. Es gibt keine globale Lösung für das Problem, außer keine Strukturen zu verwenden oder die Alignment-Prüfung zu deaktivieren und Leistungseinbrüche am Frontend zu erleiden.

Beachten Sie, dass die 32-Bit-Arme, mit denen wir heute normalerweise arbeiten, einen 64-Bit-AMBA/AXI-Bus nicht verwenden 32, sie können dennoch alle Ausrichtungen (16, 32, 64) für Übertragungen überprüfen, wenn sie aktiviert sind, aber die nicht ausgerichtete Leistung trifft zumindest auf der AMBA/AXI-Ebene treffen Sie nicht, es sei denn, Sie überqueren die 64-Bit-Grenze. Möglicherweise haben Sie noch einen zusätzlichen Cache-Zeilen-Treffer, obwohl das unwahrscheinlich ist, wenn Sie keinen AMBA/AXI-Treffer haben.

+0

" Ja, alle Prozessoren haben eine Ausrichtung Strafe "Dies ist nicht korrekt, da die überwiegende Mehrheit aller 8 - Bit - Mikrocontroller aus offensichtlichen Gründen überhaupt keine Alignment - Strafen hat. Und es gibt viele 16 - Bit - diejenigen, die auch nicht. – Lundin

+0

fair genug, wenn die mögliche Übertragungen sind größer als die Größe der Busse, oder Ausrichtung kann Sie in mehrere Zyklen für eine Übertragung, dann gibt es eine Strafe Ja gibt es 8 Bit und einige 16s ohne eine Strafe aufgrund der Ausrichtung. –