微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > MDK对齐方式设定

MDK对齐方式设定

时间:11-27 来源:互联网 点击:

对于struct D,自身对齐值为8。前面三个成员与 struct C 是一致的。对于第四成员d,因为 0x0024 % 4 = 0, 所以可以从0x0024开始存放d, 其地址范围为0x00024~0x00027.此时成员都存放结束,结构体长度为28,28 不是结构体自身对齐值8的倍数,所以要在后面补四个空格,即在0x0028~0x0031上补四个空格。补完了,结构体长度为32, 为结构体自

身对齐值的4被,,符合条件(二).
此时满足条件(一)和条件(二),struct D 中各成员在内存中的位置为:a*** b **** c d **** ,sizeof(struct D) = 32。(每个星号代表一位,成员各自代表自己所占的位,比如a占一位,b占八位,c占八位, d占四位)。

对于struct E 中各成员在内存中的位置为:a*** b c d, sizeof(struct E) = 24。(每个星号代表一位,成员各自代表自己所占的位,比如a占一位,b占四位,c占八位, d占八位)。
通过struct D 和 struct E 可以看出,在成员数量和类型一致的情况,后者的所占空间少于前者,因为后者的填充空字节要少。如果我们在编程时考虑节约空间的话,应该遵循将变量按照类型 大小从小到大声明的原则, 这样尽量减少填补空间。另外,可以在填充空字节的地方来插入reserved成员, 例如
struct A
{
char a;
char reserved[3];
int b;
};
这样做的目的主要是为了对程序员起一个提示作用,如果不加则编译器会自动补齐。

习题

typedef struct

{

int a;//ARM(int=4)51(int=2)

char b;// 1

short c;// 2

}AAA;

typedef struct

{

char b;

int a;

short c;

}BBB;

i = sizeof(AAA);

j = sizeof(BBB);

//注意在51单片机,ARM,PC不同

51 (i=j=5)//好像强制单字节对齐

ARM(i=8,j=12)//按规则默认对齐

PC(i=8,j=12)

AAA对齐方式如下(ARM)

I I I I

I0I I

BBB对齐方式如下(ARM)

I0 0 0

IIII

I I0 0

通过#pragma pack可以调整对齐字节数

#pragma pack(1) //指定Align为 1字节;

。。。。。。。。。。。。//需要对齐的结构体

#pragma pack() //恢复到原先值

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top