C können Zeiger mit jedem anderen Datentyp ausgerichtet werden?

8

Ich habe ein gezacktes mehrdimensionales Array implementiert, indem ich den Platz für die Zwischenfelder sowie die tatsächlichen Elemente im 1 großen Block zugewiesen habe. Während ich daran arbeitete, dachte ich, dass ich die Ausrichtung der Elemente berücksichtigen musste, nur für den Fall. Aber ich bin mir nicht sicher, ob diese Sicherheitsüberprüfung notwendig ist, also bin ich gekommen, um zu fragen: Würde die Größe eines Zeigers Dinge für irgendeinen anderen Typ ausrichten?

Kurz gesagt: Ein zusammenhängender Speicherbereich aus einem Aufruf von malloc , der wie folgt aussieht:

%Vor%

Brauche ich wirklich das Padding hier, wenn das erste Array aus Zeigern besteht? Gibt es Fälle, in denen das Padding notwendig ist?

    
Brian Rodriguez 31.12.2014, 04:50
quelle

2 Antworten

2

Der C-Standard garantiert nicht explizit, dass Objektzeiger die strengsten Ausrichtungsanforderungen haben. Auf einigen Systemen kann long double eine strengere Ausrichtungsanforderung haben. Auf anderen Systemen können Funktionszeiger eine strengere Ausrichtungsanforderung haben.

Mit etwas Sorgfalt und Aufmerksamkeit können Sie jedoch die Ausrichtungsanforderungen bestimmen. Sie müssen entscheiden, wie tragbar und automatisch Sie die Antwort benötigen. Es ist leicht, eine Antwort zu finden, indem man Code kompiliert und die Antwort findet. Es ist wesentlich schwieriger, eine narrensichere automatische Methode zu erstellen, die es automatisch für jeden Typ macht, nicht zuletzt, weil der willkürliche Elementtyp größer oder kleiner als ein Objektzeiger sein kann.

    
Jonathan Leffler 31.12.2014, 07:08
quelle
2

Sie haben nicht alle erforderlichen Details angegeben, um diese Frage zu beantworten.

Hier ist ein Beispiel, wo Padding notwendig ist:

%Vor%

Wenn Sie auf einer 32-Bit-Plattform arbeiten AND Sie eine ungerade Anzahl von Zeigern definiert haben, dann benötigen Sie eine 4-Byte-Auffüllung, um die Ausrichtung der 8-Byte sicherzustellen Variable am Anfang jedes Elements.

Beachten Sie außerdem, dass, wenn Sie mehr als ein einzelnes Element im Array speichern möchten, die Größe des Elementtyps selbst ein Vielfaches von 8 Bytes sein muss, damit dies funktioniert.

Wenn Sie das Padding komplett vermeiden möchten, müssen Sie memcpy jedesmal ein Element von und in das Array einfügen, wenn Sie auf dieses spezifische Element zugreifen (lesen oder schreiben) müssen.

    
barak manos 31.12.2014 07:03
quelle