Hoffentlich ist das jetzt nicht zu großer Mist:
Durch die SIMD-Architektur (
add ,
mad ,
dp4 ,
usw.) werden Instruktionen immer auf 4 Fließkommazahlen gleichzeitig angewendet. D.h. es sollten diese auch immer auf einmal aus dem Speicher geholt werden. Daraus ergibt sich die Ausrichtung des Speichers an Vielfachen der Größe eines aus 4 Fielßkommazahlen bestehenden Registers. Pro Takt kann im Idealfall (warmer Cache) eines ausgelesen werden. Würden Daten (z.B. ein Vektor) jetzt über mehrere Register verteilt, wären mehrere Take zum Auslesen und Zusammensetzen über die Registergrenze hinweg nötig. Da das wiederum in einer auf unbedingte Leistung ausgelegten Architektur eher suboptimal wäre, wird versucht das zu vermeiden.
C++ Compiler (und vermutlich auch die aller anderen Sprachen) machen das auch, da die x86-Architektur auf 4 Bytes ausgerichtet ist. Allerdings transparent und per Option ausschaltbar (z.B. #pragma pack(1) struct { char a; int b; } wird zu "abbbb" (pro Buchstabe ein Byte des entsprechenden Feldes), mit pack(4) zu "a...bbbb"). Solange man alles einheitlich kompiliert stellt das kein Problem dar, aber hinsichtlich der Performance (aber auf Kosten des Speichers) ist es wie schon gesagt weniger optimal. Beim schreiben von Strukturen im Binärformat in Dateien ist es hingegen eine ziemlich gemeine Stolperfalle, wenn z.B. der eine die gesamte Struktur auf 4 Bytes ausgerichtet auf einmal schreibt (fwrite(handle, sizeof(MyStruct, 1), src), der andere anschließend jedes Feld einzeln per fread(handle, sizeof(myField), 1, dst) ausliest oder mit einer anderen Ausrichtung die gesamte Struktur ausliest, usw.
Das gleiche Problem besteht genauso beim Übergang zwischen C++ und der Grafikarchitektur. Der C++-Compiler kennt die Ausrichtung der Zielarchitektur nicht, weshalb das von Hand zu machen ("pad[3]") oder auf Hilfsmittel wie D3DReflect zurückzugreifen ist, um mehr über die Struktur des Buffers zu erfahren (der Quelltext des Effects11-Frameworks liegt dem SDK bei, um einmal genau zu sehen, wie man das optimal löst). Das ist Mist, aber notwendig.
Ob und wie man genau diese Ausrichtung dem C++-Compiler irgendwie beibringen könnte, weiß ich nicht.