Gibt es ein gutes Beispiel, das den Unterschied zwischen einer struct
und eine union
? Im Grunde weiß ich, dass struct
verwendet den gesamten Speicher seines Mitglieds und union
verwendet den größten Speicherplatz der Mitglieder. Gibt es weitere Unterschiede auf Betriebssystemebene?
Antworten
Zu viele Anzeigen?Was ist der Unterschied zwischen Struktur und Gewerkschaft?
Die kurze Antwort lautet: Die Abweichung liegt in der Speicherzuweisung. Erläuterung: In einer Struktur wird Speicherplatz für alle Mitglieder innerhalb der Struktur geschaffen. In einer Union wird nur für das Mitglied, das den größten Speicherplatz benötigt, Speicherplatz angelegt. Betrachten Sie den folgenden Code:
struct s_tag
{
int a;
long int b;
} x;
union u_tag
{
int a;
long int b;
} y;
Hier gibt es zwei Mitglieder innerhalb von struct und union: int und long int. Der Speicherplatz für int ist: 4 Byte und Speicherplatz für long int ist: 8 in 32-Bit-Betriebssystemen.
Für struct werden also 4+8=12 Bytes erstellt, während für union 8 Bytes erstellt werden
Code-Beispiel:
#include<stdio.h>
struct s_tag
{
int a;
long int b;
} x;
union u_tag
{
int a;
long int b;
} y;
int main()
{
printf("Memory allocation for structure = %d", sizeof(x));
printf("\nMemory allocation for union = %d", sizeof(y));
return 0;
}
Ref: http://www.codingpractise.com/home/c-programming/structure-and-union/
Eine Struktur ist eine Sammlung von verschiedenen Datentypen, in der verschiedene Datentypen enthalten sein können und jeder seinen eigenen Speicherblock erhält.
Normalerweise verwenden wir eine Union, wenn wir sicher sind, dass nur eine der Variablen auf einmal verwendet wird und Sie die volle Ausnutzung des vorhandenen Speichers wünschen, da sie nur einen Speicherblock erhält, der dem größten Typ entspricht.
struct emp
{
char x; //1 byte
float y; //4 byte
} e;
Gesamtspeicherbedarf: =>5 Bytes.
union emp
{
char x; //1 byte
float y; //4 byte
} e;
Gesamter Speicherplatz: 4 Bytes.
Die Verwendung von Gewerkschaften Unions werden häufig verwendet, wenn spezialisierte Typkonversationen erforderlich sind. Um eine Vorstellung von der Nützlichkeit von union zu bekommen. Die c/c-Standardbibliothek definiert keine Funktion, die speziell dafür ausgelegt ist, kurze Ganzzahlen in eine Datei zu schreiben. Die Verwendung von fwrite() verursacht einen übermäßigen Overhead für eine einfache Operation. Mit einer Union kann man jedoch leicht eine Funktion erstellen, die eine kurze ganze Zahl byteweise in eine Datei schreibt. Ich nehme an, dass kurze Ganzzahlen 2 Byte lang sind.
DAS BEISPIEL:
#include<stdio.h>
union pw {
short int i;
char ch[2];
};
int putw(short int num, FILE *fp);
int main (void)
{
FILE *fp;
fp fopen("test.tmp", "wb ");
putw(1000, fp); /* write the value 1000 as an integer*/
fclose(fp);
return 0;
}
int putw(short int num, FILE *fp)
{
pw word;
word.i = num;
putc(word.c[0] , fp);
return putc(word.c[1] , fp);
}
obwohl putw() mit einer kurzen Ganzzahl aufgerufen wurde, war es möglich, putc() und fwrite() zu verwenden. Aber ich wollte ein Beispiel zeigen, um zu verdeutlichen, wie eine Union verwendet werden kann
Unions sind beim Schreiben einer Byte-Ordering-Funktion, die unten angegeben ist, sehr nützlich. Mit structs ist das nicht möglich.
int main(int argc, char **argv) {
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
if (sizeof(short) == 2) {
if (un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
} else
printf("sizeof(short) = %d\n", sizeof(short));
exit(0);
}
// Program from Unix Network Programming Vol. 1 by Stevens.