#include<stdio.h>
static struct s
{
unsigned a:5;
unsigned b:5;
unsigned c:5;
unsigned d:5;
}v={1,2,3,4};
int main()
{
printf("size of v = %d\n",sizeof(v));
}
“答案是 4”。我无法解释这个输出。
#include<stdio.h>
static struct s
{
unsigned a:5;
unsigned b:5;
}v={1,2};
int main()
{
printf("size of v = %d\n",sizeof(v));
}
“答案仍然是 4” .. 位域如何影响结构大小??
最佳答案
默认情况下,gcc 在字节边界上对齐数据,而在某些平台(尤其是 RISC)上,在机器字边界上对齐数据。这是因为非字节对齐读取(在 RISC 机器上)会导致异常,从而减慢程序速度。
这就是为什么每个字段都存储在自己的字节中,即使它们只有 5 位长。为了正确打包,使用 __attribute__((packed))
:
#include<stdio.h>
static struct s
{
unsigned a:5 __attribute__((packed));
unsigned b:5 __attribute__((packed));
}v={1,2};
int main()
{
printf("size of v = %d\n",sizeof(v));
}
这个的输出是:
size of v = 2
这是预期的,因为您总共有 10 个字节,大小四舍五入到下一个字节。
关于c - 具有位域的结构大小的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17132854/