先看以下代码:
#include <stdio.h>
#pragma pack(1)
struct Test
{
int a;
long long int b;
};
#pragma pack()
int main()
{
Test a;
long long int n = __sync_fetch_and_add(&a.b, 1);
printf("Before: %d\n", n);
printf("After: %d\n", a.b);
return 0;
}
以上代码在IA-64 linux平台上面编译运行,将会出现:
1: (11007): unaligned access to 0x60000fffffb7f5fc, ip=0x4000000000000791
2: 总线错误
原因分析:
1) 由于Ia-64平台是以8字节对齐的,不是8字节对齐的内存访问方式的话将会出现unaligned access错误.
2) 总线错误是在调用__sync_fetch_and_add时出现的.原因也是跟字节对齐有关.(具体原因可能是跟IA-64架构的寄存器是64位的有关)
所以在IA-64平台上编译,并且对结构体中某个字段做原子操作的话,需要注意一下结构体字段定义的顺序.
上述Test结构体只要把a和b的定义顺序调整一下,就可以正常运行了.