关于C位域的问题
-
bitfield是C概念还是C ++?
-
它只能在结构中使用吗? 我们可以使用它们的其他地方有哪些?
-
AFAIK,bitfields是特殊的结构变量,只占用指定的no。 比特。 它在节省内存方面很有用。 我对么?
我编写了一个小程序来理解位域的使用 – 但是,我认为它没有按预期工作。 我希望下面结构的大小为1 + 4 + 2 = 7个字节(考虑到unsigned int的大小在我的机器上是4个字节),但令我惊讶的是,结果是12个字节(4 + 4 + 4) )。 谁能让我知道为什么?
#include 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
移动a
一起,则struct的大小将变为8个字节。
此外,您告诉编译器您希望仅占用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)除了节省内存外,它们还可以用于某种forms的比特琐事。 但是,内存节省和twiddling本质上都依赖于实现 – 如果你想编写便携式软件,请避免使用位字段。
它的C.
您的编译器已将内存分配四舍五入为12个字节以进行对齐。 大多数计算机内存syubsystems无法处理字节寻址。
你的程序正如我所期望的那样工作。 编译器将相邻的位域分配到相同的存储器字中,但是您的位域由非位域分隔。
将位域移动到彼此旁边,你可能会得到8,这是你机器上两个整数的大小。 位域将打包成一个int。 但是,这是特定于编译器的。
位域对于节省空间非常有用,但其他方面并不多。
位域广泛用于固件中以映射寄存器中的不同字段。 这节省了许多手动按位操作,这些操作在没有它的情况下读取/写入字段是必需的。 一个缺点是你无法获取位域的地址。