1

当我在我的 Mac 上运行 sizeof(r) 时。它说sizeof(r) = 1。我的理解是联合的大小是其最大元素的大小。在这种情况下,最大的元素不应该是 struct 吗?

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

    char ch;
}r;
4

2 回答 2

11

您的联合由两部分组成,一个结构和一个字符。联合的大小,因为它共享内存,是最大元素的大小,加上它粘贴的任何填充的大小(在你的情况下是 0 字节)。

首先,让我们看看每个大小的 ideone 报告:http:
//ideone.com/LAhop

好的,两者都是 1。因此,联合的大小也必须为 1。

该结构由位域组成。一位是 1 位,一位是 2 位,一位是 3 位。这在一个字节中给出了 8 位中的总共 6 位。因为无论如何它必须至少是一个字节(位域的大小并不是真的以位为单位),所以大小为 1。

至于 char,这是 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.

对于几乎每个平台,这是一个字节。
这是一个字节。

于 2012-07-25T06:52:11.097 回答
4

struct s 占用 1 + 2 + 3 = 6 位,这些位适合 1 个字节,并且它与 1 个字节的 char 联合。因此答案是 1 个字节。

于 2012-07-25T06:51:14.787 回答