GCC
的字节对齐控制
GCC
也支持
#pragma
字节控制
l
#pragma pack (n)
,
gcc
将按照
n
个字节对齐
l
#pragma pack ()
,取消自定义字节对齐方式
#pragma
只保证的成员相关偏移量是字节对齐的
.
不保证绝对地址对齐
.
GCC
也支持某个一个数据结构实现绝对地址的自然对齐
__attribute((aligned (n)))
让所作用的结构成员对齐在
n
字节自然边界上。如果结构中有成员的长度大于
n
,则按照最大成员的长度来对齐。
__attribute__ ((packed))
,取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
struct STRUCT_TEST 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
字节对齐练习
请指在
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 ()
{
char a;
int b;
char c;
} __attribute__ ((packed))
; //
注意位置
,
在
}
与
;
之间
{
char a;
int b;
char c;
} ;
不同环境下的字节对齐使用
最新推荐文章于 2022-01-12 18:15:02 发布
4028

被折叠的 条评论
为什么被折叠?



