GCC 的字节对齐控制
GCC 也支持 #pragma 字节控制
l #pragma pack (n) , gcc 将按照 n 个字节对齐
l #pragma pack () ,取消自定义字节对齐方式
#pragma 只保证的成员相关偏移量是字节对齐的 . 不保证绝对地址对齐 .
GCC 也支持某个一个数据结构实现绝对地址的自然对齐
__attribute((aligned (n))) 让所作用的结构成员对齐在 n 字节自然边界上。如果结构中有成员的长度大于 n ,则按照最大成员的长度来对齐。
__attribute__ ((packed)) ,取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
struct STRUCT_TEST
{
char a;
int b;
char c;
} __attribute__ ((packed)) ; // 注意位置 , 在 } 与 ; 之间
l __attribute 是 GCC 属性 , 跟#pragma 不同, __attribute__ 是 gcc 的方言 , 只有 GCC 能识别 , 不要在 VC++ 之类编译器使用这种定义 .
l __attribute 每次只对一个结构生效 .
ADS 的字节对齐控制
ARM 对访问地址有特殊要求 , 如果不对齐 , 会造成程序错误 , 而不是象 X86 或 PowerPC 那样折成两个指令访问 . 因此用 #pragma pack(1) 只是让结构本身成员内部按 1 对齐 , 并不能保证结构的绝对地址是对齐 .
ADS 采用特殊指令来实现要想保证地址对齐 .ADS 采用 ALIGN.__align(num), .__packed, 来控制字节对齐
l ALIGN 用于汇编的字节对齐控制
l __align(num) 类似于 #pragma pack(num), 用于整片代码字节对齐的的控制 .
l __packed 取消某个结构或成员的内部字节对齐 , 并实现绝对地址对齐 , 类似于 gcc 的 __attribute__ ((packed));
__packed struct STRUCT_TEST
{
char a;
int b;
char c;
} ;
字节对齐练习
请指在 windows 32 下出下列值的 sizeof 和各个成员的偏移量
1. struct s1{
short a;
short b;
short c;
};
2. struct s2{
char a[21];
short b;
};
3. struct s2{
float a;
char b;
short c;
int d;
};
5. #pragma pack (1)
typedef struct s8
{
char a;
int b;
short c;
double d;
}s8;
#pragma pack ()