Betrachten Sie die folgende Struktur:
%Vor%Es scheint mir, dass ich in WinApis IPAddress-Struktur etwas Ähnliches gesehen habe. Die Idee ist, mir die Möglichkeit zu geben, die Array-Komponenten sowohl nach Index als auch nach Namen zu verwenden, zum Beispiel:
%Vor% Im C ++ - Standard gibt es eine Garantie, dass es am Anfang einer POD-Struktur keinen "leeren" Raum geben wird, das heißt, das Element x befindet sich direkt am Anfang der Endpoint-Struktur. Gut soweit. Aber ich finde keine Garantie, dass es keinen Leerraum oder Abstand zwischen x
und y
, oder y
und z
usw. geben wird. Ich habe nicht ausgecheckt der C99-Standard jedoch.
Das Problem ist, dass, wenn zwischen Endpoint-Strukturelementen ein leerer Platz ist, die Idee nicht funktioniert.
Fragen:
Habe ich Recht, dass es in der Tat keine Garantie gibt, dass dies in C oder C ++ funktioniert.
Funktioniert das praktisch bei jeder bekannten Implementierung? Mit anderen Worten, kennen Sie eine Implementierung, wo dies nicht funktioniert?
Gibt es einen Standard (ich meine nicht Compiler-spezifisch), um dieselbe Idee auszudrücken? Vielleicht helfen die C ++ 0x-Ausrichtungsfunktionen?
Das mache ich übrigens nicht im Produktionscode, keine Sorge, nur neugierig. Vielen Dank im Voraus.
.z()
statt nur mit .z
enden) Die meisten Compiler sollten die Zerlegung einer Struktur mithilfe eines Pragmas oder eines Attributs unterstützen. #pragma pack
zum Beispiel.
Sie können Speicherausrichtungsprobleme umgehen, indem Sie auf jedes Element des Arrays verweisen, solange Sie das Array vor den Referenzen in der Klasse deklarieren, um sicherzustellen, dass sie auf gültige Daten verweisen. Nachdem ich gesagt habe, dass ich die Ausrichtung nicht bezweifle, wäre das ein Problem bei Doubles, könnte es aber auch für andere Typen sein (float auf 64bit arch?)?
%Vor%Hoffe, das hilft.
Wenn es um den Standard geht, gibt es zwei Probleme:
Nachdem dies gesagt wurde, wird dies in der Praxis mit normalen Compilern funktionieren. Tatsächlich ist diese Art von Code weit verbreitet und wird häufig verwendet, um Werte eines Typs in Werte eines anderen Typs umzudeuten.
Padding-Bytes verursachen kein Problem, da alle Variablen vom Typ double
sind. Der Compiler behandelt Vector4D
als double
-Array. Das heißt, v.Endpoint.z
ist im Wesentlichen identisch mit v[2]
.
Tags und Links c c++ c++11 unions memory-alignment