union und struct in c++ ohne namen

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

union und struct in c++ ohne namen

Beitrag 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!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: union und struct in c++ ohne namen

Beitrag 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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: union und struct in c++ ohne namen

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten