当我在我的Mac上运行sizeof(r)。它说sizeof(r)= 1。我的理解是,联盟的规模是其最大元素的大小。在这种情况下,最大的元素不应该是结构体?奇怪的sizeof()结果
union
{
struct
{
char i:1;
char j:2;
char m:3;
}s;
char ch;
}r;
当我在我的Mac上运行sizeof(r)。它说sizeof(r)= 1。我的理解是,联盟的规模是其最大元素的大小。在这种情况下,最大的元素不应该是结构体?奇怪的sizeof()结果
union
{
struct
{
char i:1;
char j:2;
char m:3;
}s;
char ch;
}r;
你的联合由两部分组成,一个结构和一个字符。因为共享内存,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.
对于几乎每一个平台,这是一个字节。
这是一个字节。
罢工最后一句话。这是一个字节的**定义**。 – 2012-07-25 07:35:13
@R ..,已经很晚了。 – chris 2012-07-25 07:37:58
联合的大小必须至少大于其最大元素的大小。例如。 'union x {short s; char byte b [3]; };'我在一个平台上的大小是4,而'short'的大小是2,'char [3]'的大小是...... 3. – 2012-07-25 08:04:18
的的struct占用了1 + 2 + 3 = 6比特,其配合到1个字节和其与一个char为1个字节unioning。因此答案是1个字节。
从技术上讲,你的位域总共有0.75字节的大小,而字符1字节。我没有看到问题。 – chris 2012-07-25 06:45:19
@chris你能详细解答一下吗?谢谢! – 2012-07-25 06:46:38
可能在那一刻,r是char ch,而不是s结构。 – levi 2012-07-25 06:47:02