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.
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%Standardmäßig wird der Compiler das Richtige tun, wenn es um die Ausrichtung geht.
Aber Sie können es mit alignas
überschreiben:
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 ).
Tags und Links arrays c++ c++11 memory-alignment std