Wie richtet man std :: array enthaltene Daten aus?

8

Da std::array nicht zulässt, seinen Zuordner zu ändern, gibt es eine Möglichkeit, sicherzustellen, dass der Zeiger auf die Datenadresse ausgerichtet ist?

Zum Beispiel, in GNU g ++ 4.8.4 und 6.1.0, der Code unten

%Vor%

stellt die folgende Ausgabe bereit, die zeigt, dass die Containerdaten auf 16-Byte-Adressen ausgerichtet sind, unabhängig vom Datentyp, der beim Kompilieren für eine x86-64-Bit-Architektur enthalten ist.

%Vor%

Allerdings wird das Ergebnis für Intels icpc v16.0.3 selbst mit -align angezeigt. Während die meisten Container auf 16-Byte-Adressen ausgerichtet sind, werden einige ( char und float -Arrays) auf kleinere Byte-Adressen (2-Byte bzw. 8-Byte) ausgerichtet.

%Vor%

BEARBEITEN

Um nur den Vorschlag von RustyX zu veranschaulichen, ist dies der geänderte Code

%Vor%

und das ist das Ergebnis, wenn ich es mit Intels icpc v16.0.3 kompiliere.

%Vor%     
Harald 20.08.2016, 21:26
quelle

1 Antwort

9

Standardmäßig wird der Compiler das Richtige tun, wenn es um die Ausrichtung geht.

Aber Sie können es mit alignas überschreiben:

%Vor%

Postscriptum

Es ist interessant, dass der Intel-Compiler es für ausreichend hält, ein char[] auf 8 Bytes auszurichten. Es ist, als würde es wissen , dass Sie auf einer x86-Plattform wenig gewinnen, indem Sie es weiter ausrichten.

Beachten Sie, dass zu viel Alignment die Leistung verringern kann, da die Speicherkapazität erhöht und die Cache-Effizienz verringert wird. Moderne x86-Architekturen (Sandy Bridge und neuer) arbeiten sehr effizient mit nicht ausgerichteten Daten, können aber teilweise genutzte Cache-Zeilen nicht kompensieren ( mehr Infos ).

    
rustyx 20.08.2016, 21:40
quelle