Seite 1 von 1

union und struct in c++ ohne namen

Verfasst: 27.01.2010 13:38
von NicTheQuick
Hallo liebe C(++)-Freunde,

ich hab folgendes Problem.
Ich habe hier eine fertige float4-Klasse, die ich gerade mit SSE2 erweitere, damit's schneller geht. :D

Die vorhandene Struktur sieht so aus, wobei t_scalar ein float ist.

Code: Alles auswählen

t_scalar x, y, z, w;
Jetzt möchte ich aber gerne eine union haben, die parallel zu diesen vier floats, noch eine Variable m vom Typ __m128 bereitstellt, sodass sich m und x, y, z, w den selben Speicherplatz teilen. Ich hab da zunächst an folgendes gedacht:

Code: Alles auswählen

union {
  struct { t_scalar x, y, z, w }
  __m1288 m;
}
Allerdings geht das so nicht, weil man anscheinend der struct einen Namen geben muss.

Ich will später ein Objekt vom Typ float4 erstellen und dann wie gewohnt direkt auf x, y, z und w zugreifen können, ohne noch irgendwas davor schreiben zu müssen.

Code: Alles auswählen

float4 a();
a.irgendwas.x = 1.f  //so nicht
a.x = 1.f //aber so
Kann man sowas bewerkstelligen? Der Hintergrund dabei ist, dass das Programm außenrum schon fertig ist und fleißig die Member x, y, z und w benutzt. Und daran will ich nichts ändern.

Danke schon mal für etwaige Hilfestellungen, Ideen oder Vorschläge!

Re: union und struct in c++ ohne namen

Verfasst: 28.01.2010 11:44
von Kaeru Gaman
ist zwar schon ewig her, dass ich was mit C gemacht hab,
aber meines Wissens und logisch einleuchtender Weise
kannst du die Benennung eines Zwischenlevels von Membern nicht einfach weglassen.
benamse ihn halt möglichst kurz, z.B. als V für Vektor.

dein Float-Quadrupel kommt mir bekannt vor, gehts um euer Raytracing?

btw. POV verwendet meines Wissens Quintupel mit alternativen 4./5. Stelle: R,G,B,F,T (filter / translucency)

Re: union und struct in c++ ohne namen

Verfasst: 28.01.2010 12:27
von DarkDragon
Also normalerweise würde man echt eine unterstruct machen und die benennen wie Kaeru Gaman sagte. In diesem Fall jedoch könnte man es glaub auch so machen:

Code: Alles auswählen

union {
  align(0 * sizeof(t_scalar)) { t_scalar x; }
  align(1 * sizeof(t_scalar)) { t_scalar y; }
  align(2 * sizeof(t_scalar)) { t_scalar z; }
  align(3 * sizeof(t_scalar)) { t_scalar w; }
  __m1288 m;
}
Oder alternativ vielleicht:

Code: Alles auswählen

union {
  t_scalar x : 0;
  t_scalar y : 1 * 8 * sizeof(t_scalar);
  t_scalar z : 2 * 8 * sizeof(t_scalar);
  t_scalar w : 3 * 8 * sizeof(t_scalar);
  __m1288 m;
}
Probiers einfach mal, ich bin mir nicht sicher ob das von jedem Compiler und auf diese Art unterstützt wird. Besonders beim zweiten bin ich mir nicht sicher, da das üblicherweise nur für Bitfelder gedacht ist.