C/C++知识点之C语言学习 - 字节对齐
小标 2018-11-26 来源 : 阅读 1059 评论 0

摘要:本文主要向大家介绍了C/C++知识点之C语言学习 - 字节对齐,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之C语言学习 -  字节对齐,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

字节对齐


字节对齐就是数据在内存中的位置。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。



字节对齐的必要性

需要字节对齐的根本原因在于CPU访问数据的效率问题。假如整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。而如果变量在自然对齐位置上,则只要一次就可以取出数据。



字节对齐的规则

对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:


    
  1. 数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。  
  2. 联合 :按其包含的长度最大的数据类型对齐。  
  3. 结构体: 结构体中每个数据类型都要对齐。




例子



struct stu{
   char sex;
   int length;
   char name[10];
  };

这个里面sex是1个字节,然后遇到length的时候,需要在sex后添加3个空字节,因为length占4个字节,而在name占10个字节之后,变为18个字节,并不对齐,所以添两个空字节。变为20个字节。



改变对齐方法


  __attribute__选项


这个是改变对齐方法的,如下例子:



struct stu{
   char sex;
   int length;
   char name[10];
  }__attribute__ ((aligned (1))); 

这个是一共变成了15个字节,因为aligned改变了自然对齐字节为1个字节。所以整体缩小了。

同样下面的声明:



struct stu{
   char sex;
   int length;
   char name[10];
  }__attribute__ ((packed)); 

这个也是15个字节。packed让结构体使用最小的对齐方式。



必须声明对齐

在设计不同CPU的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不一样.
        
            $(function () {
                $(‘pre.prettyprint code‘).each(function () {
                    var lines = $(this).text().split(‘\n‘).length;
                    var $numbering = $(‘

  • ‘).addClass(‘pre-numbering‘).hide();


  •                     $(this).addClass(‘has-numbering‘).parent().append($numbering);


  •                     for (i = 1; i <= lines; i++) {


  •                         $numbering.append($(‘

  • ‘).text(i));
                        };
                        $numbering.fadeIn(1700);
                    });
                });

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程