2012-07-25 161 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个字节。