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

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

  今天给大家带来一道经典、易错的关于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语言笔试、面试题中的高频题目,很有必要弄清楚。
  以上就是本次的分享,如有错误,欢迎指出!谢谢

中兴持续发力,5300mAh电池1TB大存储4nm芯片,真猛功能机向智能机过渡时期,中兴手机品牌在当时的手机市场还是很火爆的。但后来进入智能手机时代,中兴的热度和销量就开始急剧下降。以至于中兴沦为国产手机的小众品牌,它的销量远远不及后来才兴安卓平板混战,HTC新品曝光10。1ampampquot屏7000mAh电池国产芯片IT之家8月8日消息今年的平板电脑市场迎来热潮,包括联想华为等都已经推出了新款平板电脑,大受用户好评,而小米荣耀realme三星等厂商也即将发布最新款平板电脑,值得期待。现在有迹象OPPO自研芯片来了近期供应链有消息传出,是关于国内手机厂商OPPO的首款自研芯片相关细节。根据供应链对问芯Voice透露,OPPO造芯的首款产品将会由6nm的先进工艺打造,并且将会是由台积电操刀,可被忽视的小米5G手机,搭载5nm芯片,轻薄手感256GB仅2399元目前小米热度最高的是即将发布的小米MIX4,MIX系列是小米最重磅的旗舰机,这款MIX4也是打磨了两三年了,自从19年的MIX3后,MIX系列就停更了。这次MIX4最大亮点在于外观豁出去!阿里女员工控诉遭领导客户侵害趁醉酒4次进房!警方最新回复昨晚(8月7日)起阿里回应女员工被侵害阿里巴巴相关话题冲上微博热搜各类微信群聊中也同样出现相关截图和聊天记录究竟发生了什么?01左中括号阿里女员工称被客户领导侵害KTV醉酒后被多次小米蓝绿联想荣耀等会不会推出自己的芯片和系统呢?难,就算会也不是近期能完成的事。芯片对我国来说,是一个整体性的难题,等待攻克关键核心难题不是一蹴而就的,就小美和联想荣耀如今的力量,不足于支撑该项目的研发,当然有权决定的领导层的想阿里市场公关委员会主席王帅无言以对,阿里不是如此的8月8日下午消息,今日阿里巴巴合伙人市场公关委员会主席王帅就阿里女员工被侵害一事,在其个人社交平台称,自己也不知道说些什么,痛心疾首是一定的。同时他表示,自己存在失职行为,但阿里不如何取得满意的助听效果?您好,首先验配合适的助听器,不管是耳背式还是定制式助听器,都有佩戴的技巧,耳背机要把耳塞塞到外耳道内,用手给阻挡看看会不会啸叫,不啸叫证明配戴合适,耳模或者定制机要分好左右,蓝左红记笔记对物业采集人脸信息,你有权说不科学或科技的发明与使用往往会予社会成员不安之感。不安之感的起因大致有三。一是担心新科技或新科学可能会在根本上改变既有的社会秩序和生活二是担心新科技(新科学)的发展会威胁人类的生存三互联网行业的繁荣时代可能快要结束了前几天大家刚为教育巨头新东方股价,因双减政策出台应声跌落,到这两天官媒体声讨网络游戏,导致腾讯市值由领先阿里一个段位到与阿里不相上下。互联网行业的相关企业,最近日子好像都没那么好过阿里女员工自曝被性侵,资本世界的性狩猎仍未结束8月7日,一位来自阿里巴巴公司的女员工控诉,在出差期间,在酒桌上被客户强行灌酒摸腿摸私处,当天夜里更是遭到直属领导曲一(本名王成文)的侵犯。但如此恶劣的事件发生之后,这位女员工在阿
MIX4独有的功能MIX4发布后,除了屏下前摄的新探索尝试外,还有一些独有的功能。下面列举部分,如有不全或不对请大家补充和指正。UWB一指连这个大家都知道,发布会也特别介绍了。这里主要讲操作界面。在小米MIX4用户的福音,小米独家功能它率先商用对于8月10日雷军的演讲,可能大家仅记住了小米MIX4记住了小米新款OLED电视记住了MIUI12。5增强版记住了小米平板5等等人。但是有一个细节可能所有人差不多都忘了,因为这个功微星推出CubiN迷你电脑搭配英特尔N6000现在很多家厂商都推出了迷你电脑,最著名的有英特尔的NUC。近日,微星推出了自家的CubiN系列迷你电脑,体积跟英特尔的很多峡谷都差不多。微星CubiN采用了小型机箱,机箱体积超小,屏幕最新OLED屏市场三星独大国产京东方维信诺增长猛近日市调机构CINNOResearch发布了一份2021年Q2第二季度(46月)的全球AMOLED智能手机面板出货报告。如上图所见,2021年Q2第二季度全球AMOLED智能手机面在手机端能固定在桌面的便签手机是人们使用频率比较多的一种辅助工具,在使用它的时候,可以根据自己的需求安装各式各样功能不同的软件来辅助自己。便签软件是很多人工作学习和生活中的好帮手,在使用手机端便签软件的时候2021年硬件质量报告已公布,OPPO斩获多项第一近日,中国移动发布了2021年智能硬件质量报告,上面有多款机型上榜。首先是5G手机综合评测TOP排行榜,它选取了2020年12月至2021年6月上市的5G手机,分四个价位段进行综合OPPOWatch2使用体验独立下载应用超长续航,堪比智能手机自从智能手表推出之后,大家都对其赋予厚望,把它称之为智能手机的第二块屏幕。不过随着技术的进步和时代的发展,智能手表其实都很注重对独立性的追求,致力于摆脱对于手机的过度依赖,比如我上华为麒麟的接班人,国产芯片黑马抢高通市场,成功跻身全球第九因为众所周知的原因,自2020年下半年禁令生效后,华为芯片全球供应链被彻底切断,麒麟系列处理器只剩为数不多的库存。即便华为仍然具备麒麟芯片自主研发的能力,受禁令限制也没有办法将芯片realme中国区总裁徐起手机品牌冲击传统PC行业,这一定是大趋势作为全球增长最快的手机厂商,realme用户数量已经达到一亿,在不断拓展手机的边界之外,又发布了首款笔记本电脑产品realmeBook。这款产品采用了英特尔第11代酷睿处理器,14进击的英特尔(INTC。US)赢得美国国防项目,发展芯片代工生态系统智通财经APP获悉,美国当地时间周一,英特尔(INTC。US)表示,其将在美国国防部一项计划的第一阶段提供商业晶圆代工服务,该计划旨在制造美国国防部系统所需的电路和商业产品。据悉,美国芯片没人要,快了?中国首台DUV光刻机完成认证近几年,中国科技企业,尤其是华为在5G半导体等方面所取得的成就,让所有国人为之骄傲。但是,包括华为在内的科技巨头都无法忽略一个短板问题,那就是芯片技术对美国的依赖。比如PC方面依赖