不同数据类型的内存对齐,在单片机上引起错误;gcc编译,在虚拟机上没报错,怎么理解呢?...

首先,介绍数据类型的对齐方式,例如在64位平台上

1、基础数据类型 在内存中的对齐方式:
   int=unsigned int:    4字节
   char=unsigned char:  1字节
   short=unsigned short:2字节
   long:                8字节
   float:               4字节
   double:              8字节
   enum:                4字节
   void:                1字节
   xxx*:(指针类型)       8字节
2、结构体类型 在内存中的对齐方式:
   a、结构体变量的首地址  是结构体最长基本类型成员的整数倍
   b、结构体中每个成员相对于结构体变量首地址的偏移量,是该成员大小的整数倍。不成整数倍则填充字节
   c、结构体的总大小,是结构体最宽基本类型成员大小的整数倍。不成整数倍则填充字节
   
   注:结构体的总大小,如sizeof计算的结果,是包括填充字节的

   如下所示,按照上面结构体的对齐计算方式a、b、c,结果是24个字节,其中填充字节为9个字节
   struct{
       char a;
       int b;
       short c;
       long d;
   };
3、与数据对齐相关的错误
   举例如下:
   a> 小转大:
      int a = 1;
      long *b = &a;
   b> 大转小:
      long a = 1;
      int *b= &a;
      
   在单片机中,这种指针问题,会报错。奇怪的是,gcc编译,没报错;运行也没出错!!!  为什么?看来还的继续分析了

【按照网友给出的说法:Arm、cortex-m3等单片机应用上,访问非对齐内存会造成硬件故障;而x86架构,对此有规避,仅是可能造成性能上的影响,但没有硬件故障】

转载于:https://www.cnblogs.com/tedani/p/10004551.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值