先来个位域申明:
struct{
type [member_name] : width ;
}
元素 | 描述 |
---|---|
type | 整数类型,决定了如何解释位域的值。类型可以是整型、有符号整型、无符号整型。 |
member_name | 位域的名称。 |
width | 位域中位的数量。宽度必须小于或等于指定类型的位宽度。 |
带有预定义宽度的变量被称为位域。位域可以存储多于 1 位的数,例如,需要一个变量来存储从 0 到 7 的值,您可以定义一个宽度为 3 位的位域,
存储从0到7的值 | 需要3位的位域 |
---|---|
0到3 | 需要2位 |
0到1 | 需要1位 |
如下:
struct
{
unsigned int age : 3; //存储0到7的数值
} Age;
此处贴的位域测试代码为网上看到,仅供参考
// 位域内存测试
#include <stdio.h>
struct ONE_BYTE
{
unsigned char _bool : 1;
unsigned char del_flag : 1;
unsigned char status : 4;
} one_byte;
struct TWO_BYTE
{
unsigned char ccc1 : 4;
unsigned char ccc2 : 4;
unsigned char ccc3 : 4;
unsigned char ccc4 : 4;
} two_byte;
struct THREE_BYTE
{
unsigned char ccc1 : 4;
unsigned char ccc2 : 4;
unsigned char ccc3 : 4;
unsigned char ccc4 : 4;
unsigned char ccc5 : 4;
} three_byte;
struct FOUR_BYTE
{
unsigned int ccc1 : 16;
unsigned int ccc2 : 16;
} four_byte;
struct EIGHT_BYTE
{
unsigned char ccc1 : 1;
unsigned int ccc2 : 1;
} eight_byte;
int main(int argc, char const *argv[])
{
printf("sizeof one_byte is : %lu\n", sizeof(one_byte));
printf("sizeof two_byte is : %lu\n", sizeof(two_byte));
printf("sizeof three_byte is : %lu\n", sizeof(three_byte));
printf("sizeof four_byte is : %lu\n", sizeof(four_byte));
printf("sizeof eight_byte is : %lu\n", sizeof(eight_byte));
return 0;
}
输出结果为:
sizeof one_byte is : 1B
sizeof two_byte is : 2B
sizeof three_byte is : 3B
sizeof four_byte is : 4B
sizeof eight_byte is : 4B
下图为本人亲自在Linux环境下运行后的结果,与上面结果一致
总结:
(1)结构体内存分配原则:
原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列。从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。
原则二: 在原则一的基础上,检查计算出的存储单元是否为所有元素中最宽的元素长度的整数倍。若是,则结束;否则,将其补齐为它的整数倍。
(2)定义位域时,各个成员的类型最好保持一致,比如都用char,或都用int,不要混合使用,这样才能达到节省内存空间的目的。