bitfield是C概念还是C++?
它只能在结构中使用吗?我们可以使用它们的其他地方是什么?
AFAIK,bitfields是特殊的结构变量,只占用指定的no.比特.它有助于节省内存而不是其他任何东西.我对么?
我编写了一个小程序来理解位域的使用 - 但是,我认为它没有按预期工作.我希望下面结构的大小为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;
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
sizeof struct s = 12 bytes
Run Code Online (Sandbox Code Playgroud)
Mar*_*off 12
因为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;
};
Run Code Online (Sandbox Code Playgroud)
占用8个字节,而
struct s{
short s1;
unsigned int b;
short s2;
};
Run Code Online (Sandbox Code Playgroud)
占用12个字节,因为在后一种情况下,两个短路各自坐在它们自己的32位对齐中.
小智 8
1)它们起源于C,但遗憾的是它们也是C++的一部分.
2)是的,或者在C++的一个类中.
3)除了节省内存外,它们还可以用于某种形式的比特琐事.但是,内存节省和twiddling本质上都依赖于实现 - 如果你想编写便携式软件,请避免使用位字段.
| 归档时间: |
|
| 查看次数: |
1296 次 |
| 最近记录: |