Ich arbeite an der Optimierung eines Projekts. Es enthält eine Struktur von Optionen, in denen Benutzer eine einzelne Option gleichzeitig auswählen können. Zusätzlich zu dieser Option verwenden wir auch eine Flag-Variable, um zu prüfen, welcher Optionswert für diesen Datensatz gesetzt ist. Um es speichereffizient zu machen, möchte ich struct in eine Union umwandeln. Aber woher weiß ich, welche Variable Wert in Union festgelegt ist. Weil es keine Einschränkung in der Union gibt, um einen Wert einer Variablen abzurufen, der nicht gesetzt ist.
%Vor% Haben Sie versucht,%% %%% in einem% union
? Sehen wir uns das folgende Beispiel an:
Die Union ( struct
) reserviert Speicher für ihre größte Variable und Sie können ihren Wert setzen und Ihre Struktur (Datensatz) wird diesen Union-Speicherblock verfolgen und der options
Flag-Wert könnte gesetzt werden, der sagt Ihr Programm, um die pentricular Variable der Vereinigung zu holen.
Gewerkschaften leiden unter einem Problem, dass es keinen einfachen Weg gibt zu wissen, welches Mitglied einer Gewerkschaft zuletzt geändert wurde. Um diese Informationen im Auge zu behalten, können Sie union
in eine Struktur einbetten, die ein anderes Mitglied hat (" Tag-Feld " oder " discriminant " genannt). Der Zweck des Tag-Feldes besteht darin, zu erinnern, welches Mitglied geändert / aktualisiert wurde. Sie können dies versuchen:
Aber in Ihrem Fall müssen Sie nicht sechs separate Mitglieder für die Gewerkschaft schreiben, da alle von int
type sind. Daher kann es auf
Lassen Sie uns die Verwendung des Tag-Feldes mit einem einfachen Beispiel verstehen. Angenommen, wir möchten ein Array, das Daten vom Typ int
und double
speichern kann. Dies wird möglich durch Verwendung von union
. Definieren Sie zuerst einen Union-Typ, der entweder int
oder double
speichert.
Als nächstes müssen wir ein Array erstellen, dessen Elemente Num
type
Angenommen, wir möchten das Element 0
von num_arr
dem Speicher 25
zuweisen, während das Element 1
speichert 3.147
. Dies kann als
Nun nehmen wir an, dass wir eine Funktion schreiben müssen, die die num_arr
-Elemente ausgibt. Die Funktion wäre so:
Warte! Wie könnte print_num
entscheiden, ob n
eine Ganzzahl oder double
enthält?
Dies wird mit dem Tag-Feld gemacht:
%Vor% Jedes Mal, wenn einem Mitglied von u
ein Wert zugewiesen wird, muss kind
muss 1 auf% festgelegt werden. co_de% oder INT
, um daran zu erinnern, welchen Typ wir tatsächlich gespeichert haben. Zum Beispiel:
Die Funktion DOUBLE
wäre wie folgt:
1 : Es liegt in der Verantwortung des Programmierers, das Tag-Feld bei jeder Zuweisung zum Member von print_num
zu aktualisieren. Das zu vergessen führt zu einem Bug, wie in Kommentar von @ j_random_hacker .