亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C / C ++中的并集大小

C / C ++中的并集大小

C++ C
BIG陽 2019-11-18 18:12:18
C / C ++中的并集大小是多少?它里面最大的數據類型的大小嗎?如果是這樣,如果聯合的較小數據類型之一處于活動狀態,編譯器如何計算如何移動堆棧指針?
查看完整描述

3 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

該標準回答了C ++標準9.5節或C99標準第6.5.2.3節第5段(或C11標準的第6段或C18標準的6.7.2.1節第16段)中的所有問題:


在聯合中,最多可以在任何時間激活一個數據成員,即,最多可以在任何時間將一個數據成員的值存儲在一個聯合中。[注:為了簡化并集的使用,做出了一項特殊保證:如果POD聯合包含多個共享共同初始序列(9.2)的POD結構,并且此POD聯合類型的對象包含以下一個: POD結構,允許檢查任何POD結構成員的公共初始序列;見9.2。聯合的大小足以容納其最大的數據成員。每個數據成員都被分配為好像它是結構的唯一成員。


這意味著每個成員共享相同的存儲區域。這里是活躍在最一個成員,但你不能找出哪一個。您將不得不將有關當前活動成員的信息自己存儲在其他地方。除了聯合以外,還存儲這樣的標志(例如,將具有整數作為類型標志的結構并將聯合作為數據存儲區)將為您提供所謂的“區分聯合”:知道哪種類型的聯合它目前是“活躍的”。


詞法分析器的一種常見用法是,您可以具有不同的令牌,但是根據令牌的不同,您可以存儲不同的信息(放入line每個結構以顯示常見的初始序列是什么):


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每個成員,因為這是每個成員的共同初始序列。


存在一些編譯器擴展,這些擴展允許訪問所有成員,而不管當前存儲了其值的成員。這樣可以有效地重新解釋每個成員之間具有不同類型的存儲位。例如,以下內容可用于將float變量分解為2個無符號短褲:


union float_cast { unsigned short s[2]; float f; };

在編寫低級代碼時,這可能非常方便。如果編譯器不支持該擴展名,但是您仍然這樣做,則編寫未定義結果的代碼。因此,如果使用該技巧,請確定您的編譯器對此有支持。


查看完整回答
反對 回復 2019-11-18
?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

一個a union總是占用最大成員的空間。現在使用什么都沒關系。


union {

  short x;

  int y;

  long long z;

}

上面的一個實例union將始終至少需要a long long進行存儲。


附注:由于注意到斯特凡諾,實際空間的任何類型(union,struct,class)將采取不依賴于其他問題,如編譯器對齊。我并不是為了簡單起見,因為我只想告訴我工會考慮了最大的項目。重要的是要知道實際大小確實取決于alignment。


查看完整回答
反對 回復 2019-11-18
  • 3 回答
  • 0 關注
  • 616 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號