C++ Speicher-alignment-Frage

Einer Zeile code ist mehr Wert als tausend Worte 🙂 Hier ist mein problem:

/* Platform specific 16-byte alignment macro switch.
   On Visual C++ it would substitute __declspec(align(16)).
   On GCC it substitutes __attribute__((aligned (16))).
*/
#define ALIGN_16 ...

struct ALIGN_16 A {...};

A* ptr = new A;
A* ptr2 = new A[20];

assert(size_t(ptr) % 16 == 0);

for (int i=0; i<20; ++i)
    assert(size_t(ptr2+i) % 16 == 0);

assert(sizeof(A) % 16 == 0);

Kann ich erwarten, dass alle Behauptungen pass auf Plattformen mit SSE-Unterstützung? Danke.

BEARBEITEN. Teilweise Antwort. Ich habe einige test mit VS2008, GCC und ICC. MS-compiler hat so anordnen, ptr und ptr2, aber GCC und ICC-Fehler beim ausrichten ptr2.

  • Warum ein array von 20 Als?
  • Nur aus meinem Kopf. Ich war Wandern, wenn jedes element des Arrays angeglichen.
  • Elemente einer korrekt zugewiesenen Arrays sind garantiert durch die Norm werden korrekt ausgerichtet für die Art in Frage. Allerdings, die Ausrichtung ist eine Implementierung detail und könnte in der Theorie werden zu einem byte (also verpackt Ausrichtung.)
InformationsquelleAutor watson1180 | 2010-12-14
Schreibe einen Kommentar