范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

经典易错的结构体内存对齐问题

  今天给大家带来一道经典、易错的关于C语言结构体内存对齐的题目:求32bit环境下以下结构体所占的字节数: typedef struct test_struct {     char a;       short b;          char c;          int d;     char e; }test_struct;
  请说出你的答案:
  下面看一下实际测试情况:1、测试代码:/***********************************  WeChat:嵌入式大杂烩 ***********************************/ #include  ​ typedef struct test_struct {     char a;       short b;          char c;          int d;     char e; }test_struct; ​ int main(void) {     test_struct test_s;   ​     printf(" ============================================ ");     printf("test_s addr   = %#.8x ", &test_s);     printf("test_s.a addr = %#.8x ", &test_s.a);     printf("test_s.b addr = %#.8x ", &test_s.b);     printf("test_s.c addr = %#.8x ", &test_s.c);     printf("test_s.d addr = %#.8x ", &test_s.d);     printf("test_s.e addr = %#.8x ", &test_s.e);     printf("sizeof(test_s) = %d ", sizeof(test_s));     printf("============================================ "); ​     return 0; }2、运行结果
  在32bit环境中,该结构体所占的字节数为16。答对了吗?
  运行结果打印输出了很多重要的信息,从结果往前分析思路应该很清晰了吧?不清晰也没关系,下面我们一起来分析分析:3、分析
  在分析这个问题之前,我们先记住关于结构体内存对齐的三条原则:
  (1)结构体变量的起始地址能够被其最宽的成员大小整除。
  (2)结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节。
  (3)结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节。
  分析这个问题我们就不考虑编译器可以指定对齐大小的情况了。在32bit环境中,一般默认的对齐大小是4。下面我们根据这三条原则来分析,并得出如下示意图:
  从这张图中我们应该可以很清晰地看出整个结构体变量的内存占用情况。如果还看不明白的朋友可阅读下面的解释(有点啰嗦,已经看明白的就不用看了~):
  从上例的结果中,我们结构体变量test_s的起始地址为0x0028ff30,能够被其最宽的成员(int类型的d成员,占4个字节)整除,符合第(1)条原则。
  a成员的地址即为结构体变量的起始地址0x0028ff30,排在a后面的是short类型(两个字节)的b成员。
  根据第(2)条规则,显然b的地址不能从0x0028ff31开始,则编译器会在b成员的前一个成员(a成员)后边补1个空白字节,即b的的地址为从0x0028ff32,符合规则(2)。
  b成员占两个字节,两个字节之后的地址为0x0028ff34,而c成员为char类型(1字节),则根据规则(2),c成员会存放至地址0x0028ff34处。
  c成员占1个字节,1个字节之后的地址为0x0028ff35,排在c后面的是int类型(4个字节)的d成员,显然不能满足规则(2)。
  编译器会在d成员的前一个成员(c成员)后面进行字节填充,这里必须填充3个字节才能符合规则(2),此时d会存放至地址0x0028ff38处。
  d成员占4个字节,4个字节之后的地址为0x0028ff3c。根据规则(2),e成员可从该地址开始存放。
  此时a+空白字节+b+c+空白字节+d+e所占的字节总数为13个字节,而结构体最宽的成员(int类型的d成员)所占字节数为4字节。显然不能满足规则(3),编译器会在e成员后面填充3个字节。即整个结构体变量test_s所占的总字节数为16字节。4、实际应用
  (1)用保留变量替代填充字节
  实际应用中我们可以上面的结构体变量改为:typedef struct test_struct {     char a;       char reserve0;    /* 保留成员 */     short b;          char c;        char reserve1[3]; /* 保留成员 */     int d;     char e;     char reserve2[3]; /* 保留成员 */ }test_struct;
  我们已经知道了编译器会自动给我们的结构体变量填充一些空白字节,这些填充字节我们是看不到的,是隐性的。在结构体变量占用相同内存的情况下,我们可以显性的表示出这些填充字节,即创建一些保留成员。
  这样当我们需要给这个结构体添加一些成员时,我们可以把保留的成员替换为实际的成员。这样在一定程度下有利于我们节省内存空间。
  (2)调整结构体成员的位置
  从上面的分析中我们知道编译器会根据我们结构体成员的排列来进行空白字节填充以达到对齐的效果。那么我们自己进行手动对齐一些成员,那就可以节省一些空间了。比如把上面的我们的test_struct结构体成员的顺序改为:typedef struct test_struct {     char a;       char c;      short b;              int d;     char e; }test_struct;
  则结构体变量test_s所占的字节数变为12字节,即:
  即比原来的16字节省下了4个字节。
  虽然这点优化对于一般的嵌入式应用来说可能没什么必要,但是万一某一天真的需要在某些资源极其受限的嵌入式设备中开发应用,这就是可以优化的一点。
  以上就是本次的分享。这道结构体内存对齐的题目很经典、也很容易出错,是嵌入式C语言笔试、面试题中的高频题目,很有必要弄清楚。
  以上就是本次的分享,如有错误,欢迎指出!谢谢

阿里自研处理器商用倚天在自研ARM处理器上,不只是苹果的M1系列取得了突破,中国厂商在这方面同样也有骄人的成绩,阿里云去年推出了倚天710处理器,这是全球首个5nmARM架构服务器处理器,最高128核,微信吃内存?五招轻松腾出10个G微信每次更新,都免不了被网友的吐槽体积越来越大,吃掉手机太多内存,手机用的越久,微信中的聊天记录视频照片等占用的内存就越多,对于小内存用户甚至出现手机卡顿的现象。今天芝麻妹就给大家北京大数据技能大赛韧性怀柔赛道开赛设置科学数据等三个子赛道中国网科技4月16日讯(记者柏林)4月15日,北京大数据技能大赛正式启动,由怀柔区经信局怀柔区科委主办的韧性怀柔赛道作为首个启动的赛道同步开赛。启动仪式上,北京市怀柔区经信局局长杨我们来自哪里时间是什么?他真的存在吗?我们现在的一天一年是如何的出来的,地球自转一周为一天,围绕太阳转一周为一年,这是我们经过很多年的观察总结出的结论,也是我们经过无代繁衍教授的习惯性意识。那思皓新能源,小激动啊其实早就关注这个车了,总觉的过段时间会便宜点的!只是没想到,这车还有涨价的时候呢!真的是想不到啊。听说要涨价3000!比我当时看要贵了一些!我记的刚过完年那会还优惠两千的,还有赠品只要不出太阳系,电永远不会淘汰未来世界能源主力就是太阳能源。而现在部分掌控就只有转化成电,对太阳转化连初步设计都没有。太阳能可用于加热流体,如太阳能集热板中的水。简单的类型使用平板收集板安装在一个南面临的屋顶或2022年3月全国受理网络违法和不良信息举报1258。6万件北京商报讯(记者魏蔚)4月16日,中央网信办披露,2022年3月,全国各级网络举报部门受理举报1258。6万件,环比增长2。1同比增长16。5。其中,中央网信办(国家互联网信息办公贾扬清错了吗?最近这几天网络上铺天盖地的都是声讨阿里副总裁的声音,我不知道大家为什么对他一片骂声,是精英阶层的特权戳痛了同样身处困境而无能为力的我们,还是单纯的仇富?首先我觉得他没什么错,趋吉避一滴水从高空掉落砸在你头顶会疼吗?有一个段子是这么说的我加入一个物理博士群,见到有人问一滴水从很高的地方落下来,会不会弄死人?群里一下就热闹起来,各种公式,各种假设,各种阻力,重力,加速度的讨论。一小时后我默默的问5G是个伪命题吗?商业社会,任何新事物在还未到来之前都需要热身,甚至大量的普及或炒作。比如4G手机到5G手机之间的过渡,除了本身5G需要普及之外,手机厂商对5G热度的推动更是功不可没。4G到5G可说生命波碳量子化技术生命波碳量子化技术是哈尔滨成程生命与物质研究所及美国成程生命科学技术研究院采用中美原创科技,通过以波能趋动物质能量信息生命统一的生命波技术,结合美国硅谷AI技术最新进展,联合研发出
家庭拖地机哪种好用,追觅智能洗地机拖吸一体拖地机值得购买吗追觅智能洗地机拖吸一体拖地机还是不错的,非常好用,可参考下面对追觅智能洗地机试用点评和感受。关注洗地机很久了,在很多品牌之间摇不定,经过对比最终选择了这款追觅H12。家里有只小奶猫万元以内75英寸电视如何选?看这一台就够了花一万元买一台电视对于普通家庭而言,是不可接受的,那么在万元以内有没有性价比更高的75英寸电视,笔者推荐一台,它的画质表现不在索尼75X90J之下,它就是TCL刚刚推出的miniL手机直播录视频绝配雷蛇魔音海妖BT无线麦克风大家好,我是波导终结者。现在手机拍视频或者直播越来越普遍,胜在小巧便携移动性好,然而想要好一点的收音效果,却又需要专业的麦克风。有线麦克风的话,会影响手机的便携性,容易勾到线,也有拯救过敏人群,让我畅快呼吸米家净化器4Pro实用测评转眼之间就到了五月份,天气也暖和了不少,本以为终于能够开始好好地享受一下生活,没想到生活先给了我一个下马威。作为一个资深鼻炎患者,每年的春季都是我鼻子要过的一道坎,各种各样的花粉和要专业,又要低调兼顾个性Lofree洛斐小翘水泥机械键盘开箱和很多人一样,我入手机械键盘就是从第一次到无数次的过程。现在手头的机械键盘多到可以说已经是到了家里领导开始要管制的程度了,但我对优秀的设计依旧毫无拒绝能力,比如这次顶着压力也要入手墨案电纸书MIX7上手,配备7英寸墨水屏,搭载安卓11开放系统记得读初中时,最大的兴趣就是去图书馆后面随着互联网的发展,我就改为用电脑手机来阅读,现在网络阅读已然成为了大多数人主流的读书方式。但无论是电脑阅读,还是手机阅读,其阅读体验与纸质书石头扫拖机器人T8Plus测评给父母家里配一台很有必要父母年纪大了,再加上腰腿不便,对于家务清洁也越来越力不从心。一直想给父母家里添置一台扫地机器人,既可以解放双手,又能钻到沙发底下这种不易清洁到的角落清扫,感觉非常有必要。但市面上很居家办公有把好的键盘工作效率翻倍杜伽K310机械键盘体验3月1日上海疫情!5月23日北京疫情!而我所在的山东也经历的从4月2日到4月22日,整20天的工厂全封闭生产隔离。而大多数办公行政人员则是进行居家办公,这就意味着该交的报表还得交,玩法丰富声音佳,HIDIZSMM2一动圈一静电耳机体验印象中Hidizs(海帝思)是以便携式播放器起家的,不过在近年来的发展中,除了当家花旦AP80这一枝儿外,也推出了耳机解码耳放(大小尾巴)等系列新品,形成了对音频各领域需求链的基本全球首款i9Evo的轻薄本,华为MateBook16s将办公体验拉满华为MateBook系列作为第三代移动办公的领导者,在行业中一直以出色的智慧化体验著称,深得消费者认可。华为全新一代笔记本MateBook16s作为高性能轻薄本市场的明星产品,再一操纵工业机器人关节具体如何操作?本文手把手教你,赶紧码住今天给大家带来工业机器人手动操纵之关节运动。在上一篇文章中(ABB机器人从入门到精通创建系统(内含软件下载链接)),相信你已经学会了如何从0开始创建机器人的系统,而在成功创建系统之