2012-07-25 158 views
1

當我在我的Mac上運行sizeof(r)。它說sizeof(r)= 1。我的理解是,聯盟的規模是其最大元素的大小。在這種情況下,最大的元素不應該是結構體?奇怪的sizeof()結果

union 
{ 
    struct 
    { 
     char i:1; 
     char j:2; 
     char m:3; 
    }s; 

    char ch; 
}r; 
+12

從技術上講,你的位域總共有0.75字節的大小,而字符1字節。我沒有看到問題。 – chris 2012-07-25 06:45:19

+0

@chris你能詳細解答一下嗎?謝謝! – 2012-07-25 06:46:38

+0

可能在那一刻,r是char ch,而不是s結構。 – levi 2012-07-25 06:47:02

回答

11

你的聯合由兩部分組成,一個結構和一個字符。因爲共享內存,union的大小是最大元素的大小,加上它所粘貼的任何填充的大小(在你的情況下是0字節)。

首先,讓我們來看看每個大小ideone報告:
http://ideone.com/LAhop

好了,都是1。因此,聯合體的大小必須是1爲好。

結構由位域組成。一個是1位,一個是2,另一個是3.這使得一個字節中總共有8個位中有6個位。由於無論如何它必須至少有一個字節(位字段的大小並不是位),因此大小爲1.

至於字符,以下是C++ 11標準在§3.9.1/ 1中所說的內容[basic.fundamental]:

Objects declared as characters (char) shall be large enough to store any member 
of the implementation’s basic character set. 

對於幾乎每一個平臺,這是一個字節。
這是一個字節。

+0

罷工最後一句話。這是一個字節的**定義**。 – 2012-07-25 07:35:13

+0

@R ..,已經很晚了。 – chris 2012-07-25 07:37:58

+0

聯合的大小必須至少大於其最大元素的大小。例如。 'union x {short s; char byte b [3]; };'我在一個平臺上的大小是4,而'short'的大小是2,'char [3]'的大小是...... 3. – 2012-07-25 08:04:18

4

的的struct佔用了1 + 2 + 3 = 6比特,其配合到1個字節和其與一個char爲1個字節unioning。因此答案是1個字節。