初识字节对齐

今天写程序的时候遇到一个小难题,如何记录下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个字节了(以后再看看有没有使精度更高的写法)

后记:以前一直听字节对齐字节对齐,不过听归听,只有自己的的确确遇到了这类问题才能深刻理解,结合者需求去看,去理解,才能加深理解,达到事半功倍的效果


谢谢观赏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值