不同数据类型的内存对齐,在单片机上引起错误;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架构,对此有规避,仅是可能造成性能上的影响,但没有硬件故障】

posted @ 2018-11-22 22:53  thinking......  阅读(439)  评论(0编辑  收藏  举报