在有些处理器上,如果在非对齐地址上存取一个一个值,可能会出“对齐异常”。 比如,4字节的int型一般都要在能被4整除的地址上存取;2字节的short型在偶数地址上被存取。 gcc有编译选项可以让用户指明代码将要运行的主机是严格对齐的、还是支持非对齐操作。 这个选项就是 -mstrict-align 或 -mono-strict-align。
这是测试代码:
struct tt
{
char first;
int second;
} __attribute__ ((packed));
struct tt b;
void foo(int p)
{
b.second = p;
}
我们申明了一个结构tt,注意它的整型成员 second 没有放在“自然位置”(因为packed的缘故),即能被它的长度4整除的位置。 然后我们在函数 foo 里对该成员赋值。 如果用 -mno-strict-align , 目标机是PowerPc, 编译出的代码较简单:
test.o: file format elf32-powerpc
Disassembly of section .text:
00000000 <foo>:
0: 94 21 ff e0 stwu r1,-32(r1)
4: 93 e1 00 1c stw r31,28(r1)
8: 7c 3f 0b 78 mr r31,r1
c: 90 7f 00 08 stw r3,8(r31)
10: 3d 20 00 00 lis r9,0
14: 39 69 00 00 addi r11,r9,0
18: 80 1f 00 08 lwz r0,8(r31)