我编写了一个小程序来理解位域的使用 - 但是,我认为它没有按预期工作。我希望下面结构的大小为1 + 4 + 2 = 7个字节(考虑到unsigned int的大小在我的机器上是4个字节),但令我惊讶的是,结果是12个字节(4 + 4 + 4) )。谁能让我知道为什么?
#include <stdio.h>
struct s{
unsigned int a:1;
unsigned int b;
unsigned int c:2;
};
int main()
{
printf("sizeof struct s = %d bytes \n",sizeof(struct s));
return 0;
}
OUTPUT:
sizeof struct s = 12 bytes
因为a
和c
不是连续的,所以每个都保留了一个完整的int值的内存空间。如果将a
和c
一起移动,结构的大小将变为8个字节。
此外,您告诉编译器您希望a
仅占用1位,而不是1个字节。因此即使a
和c
彼此相邻也应该只占3位(仍然在单个字节下),a
和c
的组合仍然在32位机器的内存中变为字对齐,因此占用了整整4个字节除了int b
。
同样,你会发现
struct s{
unsigned int b;
short s1;
short s2;
};
占用8个字节,而
struct s{
short s1;
unsigned int b;
short s2;
};
占用12个字节,因为在后一种情况下,两个短路各自坐在它们自己的32位对齐中。
1)它们起源于C,但遗憾的是它们也是C ++的一部分。
2)是的,或者在C ++的一个类中。
3)除了节省内存外,它们还可以用于某种形式的比特琐事。但是,内存节省和twiddling本质上都依赖于实现 - 如果你想编写便携式软件,请避免使用位字段。
它的C.
为了进行对齐,您的编译器已将内存分配四舍五入为12个字节。大多数计算机内存子系统无法处理字节寻址。
你的程序正如我所期望的那样工作。编译器将相邻的位域分配到相同的存储器字中,但是您的位域由非位域分隔。
将位域移动到彼此旁边,你可能会得到8,这是你机器上两个整数的大小。位域将打包成一个int。但是,这是特定于编译器的。
位域对于节省空间非常有用,但其他方面并不多。
位域广泛用于固件中以映射寄存器中的不同字段。这节省了许多手动按位操作,这些操作在没有它的情况下读/写字段是必需的。一个缺点是你无法获取位域的地址。