今天写程序的时候遇到一个小难题,如何记录下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个字节了(以后再看看有没有使精度更高的写法)
后记:以前一直听字节对齐字节对齐,不过听归听,只有自己的的确确遇到了这类问题才能深刻理解,结合者需求去看,去理解,才能加深理解,达到事半功倍的效果
谢谢观赏!