3 回答

TA貢獻1876條經(jīng)驗 獲得超6個贊
該標準回答了C ++標準9.5節(jié)或C99標準第6.5.2.3節(jié)第5段(或C11標準的第6段或C18標準的6.7.2.1節(jié)第16段)中的所有問題:
在聯(lián)合中,最多可以在任何時間激活一個數(shù)據(jù)成員,即,最多可以在任何時間將一個數(shù)據(jù)成員的值存儲在一個聯(lián)合中。[注:為了簡化并集的使用,做出了一項特殊保證:如果POD聯(lián)合包含多個共享共同初始序列(9.2)的POD結(jié)構(gòu),并且此POD聯(lián)合類型的對象包含以下一個: POD結(jié)構(gòu),允許檢查任何POD結(jié)構(gòu)成員的公共初始序列;見9.2。聯(lián)合的大小足以容納其最大的數(shù)據(jù)成員。每個數(shù)據(jù)成員都被分配為好像它是結(jié)構(gòu)的唯一成員。
這意味著每個成員共享相同的存儲區(qū)域。這里是活躍在最一個成員,但你不能找出哪一個。您將不得不將有關(guān)當(dāng)前活動成員的信息自己存儲在其他地方。除了聯(lián)合以外,還存儲這樣的標志(例如,將具有整數(shù)作為類型標志的結(jié)構(gòu)并將聯(lián)合作為數(shù)據(jù)存儲區(qū))將為您提供所謂的“區(qū)分聯(lián)合”:知道哪種類型的聯(lián)合它目前是“活躍的”。
詞法分析器的一種常見用法是,您可以具有不同的令牌,但是根據(jù)令牌的不同,您可以存儲不同的信息(放入line每個結(jié)構(gòu)以顯示常見的初始序列是什么):
struct tokeni {
int token; /* type tag */
union {
struct { int line; } noVal;
struct { int line; int val; } intVal;
struct { int line; struct string val; } stringVal;
} data;
};
該標準允許您訪問line每個成員,因為這是每個成員的共同初始序列。
存在一些編譯器擴展,這些擴展允許訪問所有成員,而不管當(dāng)前存儲了其值的成員。這樣可以有效地重新解釋每個成員之間具有不同類型的存儲位。例如,以下內(nèi)容可用于將float變量分解為2個無符號短褲:
union float_cast { unsigned short s[2]; float f; };
在編寫低級代碼時,這可能非常方便。如果編譯器不支持該擴展名,但是您仍然這樣做,則編寫未定義結(jié)果的代碼。因此,如果使用該技巧,請確定您的編譯器對此有支持。

TA貢獻1934條經(jīng)驗 獲得超2個贊
一個a union總是占用最大成員的空間?,F(xiàn)在使用什么都沒關(guān)系。
union {
short x;
int y;
long long z;
}
上面的一個實例union將始終至少需要a long long進行存儲。
附注:由于注意到斯特凡諾,實際空間的任何類型(union,struct,class)將采取不依賴于其他問題,如編譯器對齊。我并不是為了簡單起見,因為我只想告訴我工會考慮了最大的項目。重要的是要知道實際大小確實取決于alignment。
- 3 回答
- 0 關(guān)注
- 615 瀏覽
添加回答
舉報