今天写程序的时候遇到一个小难题,如何记录下64个设备的有无动作的表示,我想到了节省资源的位域,写下如下的程序(32位PC下)
typedef struct
{
unsigned f1 : 1;
}new_log_t;
sizeof(new_log_t) = 4,似乎没有节省资源吗,再试
typedef struct
{
unsigned f1 : 1;
unsigned f2 : 1;
unsigned f3 : 1;
unsigned f4 : 1;
unsigned f5 : 1;
unsigned f6 : 1;
unsigned f7 : 1;
unsigned f8 : 1;
}new_log_t;
sizeof(new_log_t) = 4,似乎了解什么了,再试
typedef struct
{
unsigned f1 : 1;
unsigned f2 : 1;
unsigned f3 : 1;
unsigned f4 : 1;
unsigned f5 : 1;
unsigned f6 : 1;
unsigned f7 : 1;
unsigned f8 : 1;
unsigned f9 : 1;
unsigned f10 : 1;
unsigned f11 : 1;
unsigned f12 : 1;
unsigned f13 : 1;
unsigned f14 : 1;
unsigned f15 : 1;
unsigned f16 : 1;
unsigned f17 : 1;
unsigned f18: 1;
unsigned f19 : 1;
unsigned f20 : 1;
unsigned f21 : 1;
unsigned f22 : 1;
unsigned f23 : 1;
unsigned f24 : 1;
unsigned f25 : 1;
unsigned f26 : 1;
unsigned f27 : 1;
unsigned f28 : 1;
unsigned f29 : 1;
unsigned f30 : 1;
unsigned f31 : 1;
unsigned f32 : 1;
unsigned f33 : 1;
}new_log_t;
sizeof(new_log_t) = 8 ,看一看只有32个成员时候占多少吧
typedef struct
{
unsigned f1 : 1;
unsigned f2 : 1;
unsigned f3 : 1;
unsigned f4 : 1;
unsigned f5 : 1;
unsigned f6 : 1;
unsigned f7 : 1;
unsigned f8 : 1;
unsigned f9 : 1;
unsigned f10 : 1;
unsigned f11 : 1;
unsigned f12 : 1;
unsigned f13 : 1;
unsigned f14 : 1;
unsigned f15 : 1;
unsigned f16 : 1;
unsigned f17 : 1;
unsigned f18: 1;
unsigned f19 : 1;
unsigned f20 : 1;
unsigned f21 : 1;
unsigned f22 : 1;
unsigned f23 : 1;
unsigned f24 : 1;
unsigned f25 : 1;
unsigned f26 : 1;
unsigned f27 : 1;
unsigned f28 : 1;
unsigned f29 : 1;
unsigned f30 : 1;
unsigned f31 : 1;
unsigned f32 : 1;
}new_log_t;
sizeof(new_log_t) = 4,我明白了,则
typedef struct
{
unsigned f1 : 1;
unsigned f2 : 1;
unsigned f3 : 1;
unsigned f4 : 1;
unsigned f5 : 1;
unsigned f6 : 1;
unsigned f7 : 1;
unsigned f8 : 1;
unsigned f9 : 1;
unsigned f10 : 1;
unsigned f11 : 1;
unsigned f12 : 1;
unsigned f13 : 1;
unsigned f14 : 1;
unsigned f15 : 1;
unsigned f16 : 1;
unsigned f17 : 1;
unsigned f18: 1;
unsigned f19 : 1;
unsigned f20 : 1;
unsigned f21 : 1;
unsigned f22 : 1;
unsigned f23 : 1;
unsigned f24 : 1;
unsigned f25 : 1;
unsigned f26 : 1;
unsigned f27 : 1;
unsigned f28 : 1;
unsigned f29 : 1;
unsigned f30 : 1;
unsigned f31 : 1;
unsigned f32 : 1;
unsigned f33 : 1;
unsigned f34 : 1;
unsigned f35 : 1;
unsigned f36 : 1;
unsigned f37 : 1;
unsigned f38 : 1;
unsigned f39 : 1;
unsigned f40 : 1;
unsigned f41 : 1;
unsigned f42 : 1;
unsigned f43 : 1;
unsigned f44 : 1;
unsigned f45 : 1;
unsigned f46 : 1;
unsigned f47 : 1;
unsigned f48 : 1;
unsigned f49: 1;
unsigned f50 : 1;
unsigned f51 : 1;
unsigned f52 : 1;
unsigned f53 : 1;
unsigned f54 : 1;
unsigned f55 : 1;
unsigned f56 : 1;
unsigned f57 : 1;
unsigned f58 : 1;
unsigned f59 : 1;
unsigned f60 : 1;
unsigned f61 : 1;
unsigned f62 : 1;
unsigned f63 : 1;
unsigned f64 : 1;
}new_log_t;
我猜sizeof后是8个字节,sizeof后果然是 8
--------------------------------------------------------------------------
我的PC 结构体是4个字节对齐的,那我如何才能让它1个字节对齐,达到我的要求以节省资源呢,使用如下语句
#pragma pack(push, 1)
结构体{}
#pragma pack(pop)
示例
#pragma pack(push, 1) //效果开始
typedef struct
{
unsigned f1 : 1;
}new_log_t;
#pragma pack(pop) //效果结束(其他的没有被这个命令包着的结构体(至少一个成员)sizeof后是4)
sizeof(new_log_t) = 1,看来精度只能是1个字节了(以后再看看有没有使精度更高的写法)
后记:以前一直听字节对齐字节对齐,不过听归听,只有自己的的确确遇到了这类问题才能深刻理解,结合者需求去看,去理解,才能加深理解,达到事半功倍的效果
谢谢观赏!