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