C++位域(bitfield)总结

前言

今天我遇到了之前阅读《C++程序设计》学过的位域,发现当时只是初步懂得了其用法和为什么要使用。 位域还存在很多特性,现在通过代码总结记录。


#include <iostream>

struct Date
{
    unsigned short nWeekDay : 3;  // 0...7
    unsigned short nMonthDay : 6; // 0...31
    unsigned short nMonth : 5;    // 0...12
    unsigned short nYear : 8;     // 0...100
};

struct Foo
{
    char a: 8; // max = 8 bit = 1 Byte warning while exceed max  
    char b: 2; // 2 bit
    int i: 15; // 15 bit
};

struct Foo1
{
    /* data */
    unsigned a: 4; // 4
    unsigned : 0; // 4+28 = 32 bit fill the memory unit, next variable move to next memory unit
    unsigned b: 4; // 4 new memory unit 
    unsigned c: 4; // 4
};

struct Foo2
{
    int i: 8; // 8 bit
    int j: 4; // 4 bit
    double b; // 64 bit the first memory unit out of range, so move to next 
    int a: 3; // the second memort unit out of range, so move to next
}; // total three memory units

int main(int argc, char *argv[])
{
    std::cout << "sizeof(unsigned int) is: " << sizeof(unsigned int) << std::endl;
    std::cout << "sizeof(unsigned short) is: " << sizeof(unsigned short) << std::endl;
    std::cout << "sizeof(struct Date) is: " << sizeof(struct Date) << std::endl;
    std::cout << "sizeof(Date) is: " << sizeof(Date) << std::endl;
    std::cout << "sizeof(Foo) is: " << sizeof(Foo) << std::endl;
    std::cout << "sizeof(Foo1) is: " << sizeof(Foo1) << std::endl;
    std::cout << "sizeof(Foo2) is: " << sizeof(Foo2) << std::endl;
    return 0;
}

特点

  1. 位域可以用于压缩存储,能用1bit的就绝不用2bit
  2. 位域增加处理时间,访问位域成员时需要把位域从它所在的字中分解出来或把值压缩存到位域所在的字位中
  3. 位域一般使用unsigned数据类型
  4. 未指定占用位默认占用所有位数
  5. 位域以数据类型来区分区域,几种数据类型就表示有几个位域段( 未指定占用位除外 )
  6. 同种位域类使用BIT超过该位域数据类型大小后继续占用该位域数据类型大小
  7. 相邻的两个位域字段的类型不同,则各个编译器的具体实现有差异,VC6采取不压缩方式,GCC和Dev-C++都采用压缩方式
  8. 未用完的BIT还是要占用内存空间,使用int类型的其中4位,后面28位仍然占用空间
  9. 位域遵循结构体对齐原则,整个结构体的总大小为最宽基本类型成员大小的整数倍
  10. 取地址操作符&不能应用在位域字段上,无法取得某个BIT的地址
  11. 位域字段不能是类的静态成员
  12. 位域字段在内存中的位置是按照从低位向高位的顺序放置的
  13. 不要在两个位域中间穿插非位域字段

参考

位域的定义和使用

C++位域

全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务