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

C编程技巧向上或向下对齐的方法及原理

  在编程中经常使用字节对齐来管理分配的内存,需要字节对齐的根本原因在于CPU访问数据的效率和存储空间的使用率问题。例如,一个处理器一次总是从存储器中取出4个字节的数据。如果所有的int类型(这里默认int类型占4个字节)数据的地址对齐成4的倍数,那么就可以用一个操作来读或写int型的数据了。否则,我们可能需要执行多次操作来实现一个int型数据的访问,因为数据可能被分放在几个4字节的存储块中,这样效率会明显降低很多。
  总体而言,字节对齐满足如下简单规律(其余的以此类推):
  2字节对齐:要求地址为2, 4, 6, 8…,二进制地址的最后一位为0(2的1次方)
  4字节对齐:要求地址为4,8,12,16…,二进制地址的最后两位为0(2的2次方)
  上述是字节对齐的简单描述,相信有过C编程经验的同学肯定是一看就明白了。有时候在编程时,要动态分配内存了,为了能充分利用内存空间和数据安全,总是会要求把分配的内存按一定的要求向上或向下对齐,那么这时候该怎么操作呢?
  首先看两个宏定义(取自RT-Thread源码)
  向上对齐:#define RT_ALIGN(size, align)           (((size) + (align) - 1) & ~((align) - 1))
  向下对齐:#define RT_ALIGN_DOWN(size, align)      ((size) & ~((align) - 1))
  向上或向下对齐,换个通俗的描述就是
  向上对齐:计算size以align为倍数的上界数(15以8为倍数的上界数:16)
  向下对齐:计算size以align为倍数的下界数(15以8为倍数的下界数:8)
  以上描述,相信大家一看就明白了,那么怎么通过编码实现呢?还是以一个实例来看
  向下对齐
  例:计算size以align字节向下对齐(int类型,这里定义占4个字节)int size = 15; int align = 8;
  以二进制理解其原理,其实开篇就给出了答案:
  8字节对齐:要求地址为8,16,24,32…,二进制地址的最后三位为0,即:align = 8;
  size对齐后二进制后三位为:000xxxxxxxx xxxxxxxx xxxxxxxx xxxxx000
  size要得到以上数,是不是与运算下面这个数呢11111111 11111111 11111111 11111000
  上面二进制数就是~((align) - 1),该数可以称其为对齐字节的掩码
  那么size的运算如下:
  size二进制表示:00000000 00000000 00000000 00001111
  按8字节对齐后为00000000 00000000 00000000 00001000
  即:size为8
  那么整个运算过程就是下面这个式子,这样就得到了向下对齐的数((size) & ~((align) - 1))
  向上对齐
  同理,要向上对齐,用的对齐字节的掩码还是一样:~((align) - 1),只需把size向上扩展一个(align-1)即可,即加上(align-1) (((size) + (align) - 1) & ~((align) - 1))
  这里可以理解下,加align-1是为了向上补齐,找出上界,看是否满align个字节
  这里有的同学可能要问了,怎么不是加align,而是align-1呢?
  还是举个例子:align = 8
  如size=16,8字节对齐的上界数就是16,此时加上align-1是23,运算后还是16,解释如下:
  16原本就是8的倍数,余数为0,向上扩展align-1个字节后,不满一个align大小,所以对齐后还是16,如果是向上扩展align,就直接加了一个align大小,显然不对
  如size=18,8字节对齐的上界数为24,此时加上align-1是25,运算后还是24,解释如下:
  18不是8的倍数,8字节对齐后,还余2个字节,要求是向上对齐,那么就需要把这2个字节凑个8字节,这时候加align-1,就变成9个字节,满足一个align大小,所以运算的结果就是24
  不是加align,而是align-1,显然明白了吧,就是一个数学问题,与求商和余数是一个道理。

大厂都开始裁员了,2022年1000万毕业生该何去何从?每年都有大批的毕业生,有部分毕业生继续考研深造,有的毕业生回到自己家乡考事业单位,从事各行各业的毕业生都有。对于大厂裁员,招聘毕业生可以节省企业成本,而且还能做到人才储备。往年都说KYC很难吗?两年都搞不定?不是搞不定,而是提前所有人k了,就会出现买卖账号!k,映射,易货,主网应该在同一个季度同时进行,只是不知道等到猴年马月!是的有难度,本来像这种认证项目方可以自己不搞,让第三方认证,支付宝的借呗和花呗都不还会怎么样?亲身经历一万三逾期前两个月,隔天接到催收电话反复拉黑,第三个月收到蚂蚁客服催收发来的以律师名义发来的警告信息再拉黑删除信息,到现在逾期半年催收的越来越少了估计没辙了吧你来看看这个花一些主流软件都用什么语言编写大部分是汇编CC,少数Java1操作系统MicrosoftWindows汇编CC备注曾经在智能手机的操作系统(WindowsMobile)考虑掺点C写的程序,比如软键盘,结果因为写出来的程序太慢,实在无法和别的京东云以数字化打造全产业链一体化服务在城市产业发展中,不同主体有着不同需求政府要监管产业要提升企业要服务。4月26日,京东云产业融合新品发布会城市产业服务专场活动推出了解决上述问题的办法京东云城市产业服务平台,并同时丁磊致歉上热搜网友充电口统一阻碍哪门子创新,早该实施了1月14日晚,网易CEO丁磊向鱼眼观察作者于平就删帖一事进行道歉,迅速又登热搜。此前,丁磊向工信部提案统一智能设备充电口。1月13日,公众号鱼眼观察作者于平提出质疑,认为统一充电端手机报价2022年01月10日新消息手机报价手机报价2022年01月10日新消息同样屏下镜头科技价格更亲民处理器市场表现也很不错这两款手机绝对值得入手性能与颜值并存且价格也很人性化重庆努比亚红魔5G仅售3888元大容欧洲星粉连夜庆祝?三星或全球停用Exynos2200处理器众所周知,三星手机一直采用双平台的策略,比如中国大陆采用骁龙处理器,而欧版则采用自家的猎户座处理器。有爆料称,三星决定将Exynos2200砍掉,全球GalaxyS22系列手机一律华为Mate50X震撼来袭,鸿蒙3。05000mAh,有5G版本最近,关于华为的消息还是比较多的,当然关注度最高的就是新旗舰Mate50系列的消息了。据相关数码博主爆料,Mate50系列中的X系列或将拥有4G和5G两个版本,很值得期待。具体来说256g手机真的没有必要买,懂手机的人都说用64很多次购买手机的时候都喜欢挑选大储存的,感觉储存大更好,尤其是实体店受到导购员的推荐,更加坚信大储存就是必要的选择,懂手机的人却都是用64G或者128G。日常使用软件也就几十mg,广发HuaweiCard升级权益,全年最高可返1200多元不久前,广发信用卡与华为共同推出的广发HuaweiCard推出车主礼遇版,面向智慧汽车场景打造车客群的专属福利。这只是广发信用卡与华为合作持续深化的举措之一。近日,广发信用卡宣布开
同种香烟不同价,外包软硬区别可大了,老烟民揭露真相香烟对很多人来说是一个日常消费品,对中国人而言,它还能用来送礼,和酒一样被认为是传统的送礼佳品。其价格也进化出了三六九等,有的一包几块十几块,有的一包则要好几百。有些常常消费的人会高速新收费制度推出,9月底或将全面推广,车主们都要注意了我国的国土面积较大,行动路程较长,便利的交通工具增加了人与人之间的联系。交通的便利也带动了经济的发展,以及各省份之间的多样交流。近几年大家的经济实力上升,家家户户都有了私家车。大家存款达200万就能方向躺平?看完这笔账,你就知道想多了根据现代经济的不断发展,有钱人变得越来越多,当然人们对于生活品质的追求也越来越高,现在还有网友笑称物价都涨,工资不涨。在收入不断的提高的时候,随之而来的生活压力也不断的加大。我们生昔日的山西首富没落,潜逃四年被悬赏2100万!大数据都找不到他22岁继承海鑫集团,27岁就已经是山西首富,作为曾经的山西首富为何到最后却成为了被通缉悬赏2100w的通缉犯?李兆会是谁?可能有些小伙伴并不知道李兆会是谁,1987年李兆会的父亲在一边限电,一边还想大力推广电动车?自从限电令发出后,我国已经有十余个省市积极响应国家号召,上至居民楼,下至工厂纷纷采取了限电措施。但是在限电令的不断深入推出后,一些矛盾也随之而来。例如尽管国家是以能源双控为目的而进三姐弟靠小生意发家致富,门店数可达8。5万,现坐拥615亿每个行业都有着自己出名的品牌,这些行业的商品有贵的也有便宜的,从低到几块钱,一两块钱的零食,饮料到高价的奢侈品,他们都有着自己其中的利润和独特的盈利方式。奢侈品的品牌大家可能熟悉很华为全屋智能战略升级鸿蒙推进12N改进用户体验今年4月,华为提出了智能家居的终极发展方向是全屋智能,并正式推出12N全屋智能解决方案,宣告了华为进一步深入智能家居行业。时隔半年之后,华为开发者大会HDC2021正式召开,全屋智双11更多用户的选择华为智慧屏SE系列65英寸只需2699元起今年的天猫和京东双11预售,从10月20日晚8点正式开启,而在预售开启的首日,华为智慧屏SE系列便取得了令人瞩目的成绩,在京东平台华为智慧屏SE55成为电视品类单品排名TOP1,在TPLink没有无线信号解决方案本文介绍了无无线信号的TPLink解决方案。使用TPLink路由器的许多用户都遇到过这样的问题也就是说,他们发现TPLink路由器没有无线信号。针对这种情况,下面提供了详细的解决方如何正确放置路由器天线的天线以更好地接收信号?使用Wifi时是否遇到过以下问题尽管路由器在客厅中,但有时信号不稳定或不够好。实际上,在许多情况下,信号差的原因不是由于路由器的质量,而是因为无线路由器的天线放置在错误的位置。那么无线扩展器扫描不到主路由器的无线信号怎么办?无线扩展器扫描不到主路由器的无线信号怎么办?或许大家在设置自个的无线扩展器时,同样会遇到扫描不到主路由器无线信号的问题,那么这是什么原因呢?遇到这种情况我们应该怎么解决呢?下面小编