Benennung von Array-Elementen oder Struktur und Array innerhalb einer Union

9

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:

  1. Habe ich Recht, dass es in der Tat keine Garantie gibt, dass dies in C oder C ++ funktioniert.

  2. Funktioniert das praktisch bei jeder bekannten Implementierung? Mit anderen Worten, kennen Sie eine Implementierung, wo dies nicht funktioniert?

  3. 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.

    
Armen Tsirunyan 23.06.2011, 10:10
quelle

4 Antworten

4
  1. ja
  2. hängt von den Ausrichtungsbedürfnissen der Architektur und der Compiler-Strategie ab
  3. nein, aber Sie könnten einen Objekt-Wrapper erstellen (aber Sie werden mit .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.

    
Let_Me_Be 23.06.2011, 10:20
quelle
4

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.

    
virgesmith 23.06.2011 10:58
quelle
1

Wenn es um den Standard geht, gibt es zwei Probleme:

  • Es ist nicht spezifiziert, was passiert, wenn man in ein Element einer Vereinigung schreibt und von einer anderen liest, siehe C-Norm 6.2.6.1 und K.1
  • Der Standard garantiert nicht, dass das Layout der Struktur mit dem Layout des Arrays übereinstimmt, siehe C-Standard 6.7.2.1.10 für Details.

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.

    
Lindydancer 23.06.2011 11:50
quelle
0

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] .

    
Vijay Mathew 23.06.2011 10:33
quelle

Tags und Links