Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 17.01.2008, 23:45 Titel: Unions vs. Strukturen |
|
|
Wollte nur einmal in Erfahrung bringen, ob jemand unions den Strukturen vorzieht, geschweige denn sie überhaupt benutzt? _________________ Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert... |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 18.01.2008, 08:15 Titel: Re: Unions vs. Strukturen |
|
|
Fruchteis hat Folgendes geschrieben: | Wollte nur einmal in Erfahrung bringen, ob jemand unions den Strukturen vorzieht, geschweige denn sie überhaupt benutzt? |
Ja, habe ich früher oft benutzt, aber inzwischen sind die Compiler so schlau, dass es wenig Sinn macht, sich noch mit ihnen rumzuärgern. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 18.01.2008, 11:06 Titel: |
|
|
Wie vorziehen? Unions und Strukturen sind etwas komplett Verschiedenes...
Strukturen(-Instanzen) sind quasi eine Komposition verschiedenen andere Objekte, eine Union zwar auch, allerdings teilen diese sich den selben Speicher. Das bedeutet, die Union reserviert ausreichend Speicher für das größte Objekt (natürlich am ggf. Prozessor-Alignment ausgerichtet), aber alle Objekte liegen in diesem Speicher und überschreiben ihn natürlich wenn man ihnen Werte zuweist. |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 18.01.2008, 15:30 Titel: |
|
|
Strukturen kann man einfache (von C geerbt) als einfache Ansammlungen von Variablen bezeichnen. Mit C++ können Strukturen natürlich noch weitaus mehr, z.B. Access-Segmentierung (private, public...), Vererbung, Methoden, Operatoren etc., also das was eine Klasse auch kann. Unions benutzen, wie GreveN gesagt hat, denselben Speicher für jedes Element. Davon kann man sich ganz elegant Nutzen machen, hier 2 kleine Beispiele: CPP: | // ein 32-bit Color Union, das sowohl die einzelnen Komponenten als auch
// ein 32-bit Wert mit der Farbe enthält
union Color
{
struct { unsigned char a, r, g, b; };
unsigned long col;
};
// ein Vektor mit sowohl x,y,z-Zugriff, als auch Array-Zugrif (geht auch als Template)
union Vector
{
struct { float x, y, z; };
float values[3];
}; | Seit c++ können sogar Unions alle Elemente einer Klasse definieren, s.o. bei struct. Im Grunde sind alles "Strukturen" nur mit mehr oder weniger großen untersch. Eigenschaften.
Willst du aber Unions benutzen, um Platz zu sparen, ist das der falsche Weg. Dazu kannst du Member-Indexing nutzen, z.B: CPP: | struct Foo
{
int ivar : 4;
bool b1 : 1;
bool b2 : 1;
char cvar : 2;
}; | Hierbei ist (norm.) sizeof Foo == 1, d.h. alle Variablen werden in einem Byte untergebracht. Im Byte-Modell sieht das so aus: Code: |
C C B B I I I I; // C -> 2 bit für cvar, B -> 1 bit für jeweils b1 und b2, I -> 4 bit für ivar |
Gruß DXer |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 18.01.2008, 16:12 Titel: |
|
|
@DirectXer
Krass, das kannte ich noch gar nicht
Unions habe ich bis jetzt auch nur genutzt, um z.B. in einer Vectorklasse die einzelnen Zahlen unter mehreren Namen ansprechen zu können. Ansonsten eigentlich noch nie. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 18.01.2008, 17:36 Titel: |
|
|
Nargh, das hatte ich aber schon paar mal erwähnt, wobei ich davon heute gar nicht mehr so angetan bin, weil ich mir nicht sicher bin, ob die einzelnen Objekte einer Struktur zwingend in der Reihenfolge im Speicher liegen in der sie im Code aufgeführt werden. Soll heißen, wenn man z.B. in einer namenlosen Struktur innerhalb der Union "unsigned char r, g, b, a;" stehen hat, könnte ich mir durchaus vorstellen, dass die r-Komponente nicht zwingend im ersten Byte stehen muss. |
|
Nach oben |
|
|
Deviloper Junior JLI'ler
Anmeldedatum: 31.05.2006 Beiträge: 77
Medaillen: Keine
|
Verfasst am: 18.01.2008, 17:42 Titel: |
|
|
doch normal sollte das schon so sein. Weshalb man auch auf die Reihenfolge acht geben sollte. (wenn sizeof usw. von nöten sind). |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 18.01.2008, 23:00 Titel: |
|
|
@GreveN: Jo ich hab das von dir schon mal so gelesen. Aber da dus net gesagt hast hab ich das mal gemacht Aber das mit der Reihenfolge ist laut C++ Standard festgelegt, du solltest es aber im Zweifelsfall trotzdem so machen: CPP: | unsigned char a;
unsigned char r;
unsigned char g;
unsigned char b; | Dann ist es eindeutig(auch für menschliche Leser).
@Jona: Ja man lernt nie aus ne Ich war auch fasziniert als ich das das erste mal bei boost so gesehen hab. Vorallem bei Bools ist das ziemlich praktisch: CPP: | struct CoolChar
{
union
{
char value;
struct
{
bool bit1 : 1;
bool bit2 : 1;
bool bit3 : 1;
bool bit4 : 1;
bool bit5 : 1;
bool bit6 : 1;
bool bit7 : 1;
bool bit8 : 1;
};
};
}; | Es gibt noch zig andere nützliche Sachen damit, du könntest jetzt z.B. in der union oder der struct noch operator[] definieren und damit auf die bits per index zugreifen... =) Möglichkeiten unbegrenz
Gruß DXer |
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 19.01.2008, 00:10 Titel: |
|
|
ich bezweifle dass der letzte code funktioniert.. es würde mich zumindestens ziemlich wundern.
dazu müsste ein boolean 1 bit groß sein, ist es aber nicht. man kann in c++ nicht einfach so auf bits zugreifen. dazu muss man mit bitmasken arbeiten. |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 19.01.2008, 01:15 Titel: |
|
|
Das klappt und man kann in C++ auch auf einzelne Bits zugreifen. ;)
@DXer:
Das "unsigned char a, b;" äquivalent zu "unsigned char a; unsigned char b" ist, ist mir bewusst, ich bin mir allerdings nicht sicher ob deshalb im Speicher a zwingend vor b liegen muss. ;)
Hast du diesen "Color-Cast" eigentlich schonmal auf Unterschiede zwischen Big Endian/Little Endian-Maschinen getestet? Eigentlich müsste es spätestens da Probleme geben, da der Long-Wert dann u.U. "falsch herum" gelesen wird.
Allerdings ist es 2 Uhr Morgens und ich will mich da jetzt auch nicht zu weit aus dem Fenster lehnen ohne da ordentlich drüber nachgedacht zu haben... ;) |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.01.2008, 11:24 Titel: |
|
|
xardias hat Folgendes geschrieben: | ich bezweifle dass der letzte code funktioniert.. es würde mich zumindestens ziemlich wundern.
dazu müsste ein boolean 1 bit groß sein, ist es aber nicht. man kann in c++ nicht einfach so auf bits zugreifen. dazu muss man mit bitmasken arbeiten. |
GreveN hat es schon gesagt, das geht Probiers aus
@GreveN: Es stimmt dass es da Unterschiede in Little-Endian und Big-Endian geben kann, das ist Prozessorspezifisch. Der Schnipsel von mir funktioniert auf Little Endian, was heutzutage von Intel und AMD Prozessoren genutzt wird. Die PPC-Familie (benutzt von Macs) benutzt Big Endian. Möchte man also auch für PPC Spiele schreiben, kann man das per Präprozessor bestimmen. Meistens reicht das jedoch, da hauptsächlich Little Endian gebraucht wird. Außerdem gibt es neben diesem Fall noch zig andere Fälle, die Little Endian vorraussetzen, beispielsweise Dateien: Benutzt man eine Bilddatei unter LE und möchte dieselbe auch unter BE benutzen, muss man im Programm eine ganze Reihe von Endian-Swaps schreiben, was eigtl keiner mehr macht (früher wurde das noch gemacht, s. Quake2). Man kann also getrost den Code verwenden. Wen das dennoch interressiert, kann sich diesen Artikel mal durchlesen.
Gruß DXer |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 19.01.2008, 13:38 Titel: |
|
|
xardias hat Folgendes geschrieben: | ich bezweifle dass der letzte code funktioniert.. es würde mich zumindestens ziemlich wundern.
dazu müsste ein boolean 1 bit groß sein, ist es aber nicht. man kann in c++ nicht einfach so auf bits zugreifen. dazu muss man mit bitmasken arbeiten. |
Türlich geht der... " : 1" sagt dem Compiler, dass du genau ein Bit haben willst. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
|