ARM字节对齐很特殊?

goodyun82 2009-07-17 07:01:15
#include <stdio.h>

class A{
unsigned short i;
};

struct B{
unsigned short i;
};

static unsigned short C;

static char D[1024];

int main()
{
printf("A:%d B:%d C:%d\n",sizeof(A),sizeof(B),sizeof(C));
printf("D's addr:0x%x\n",(unsiged int)&D[0]);
return 0;
}

在PC X86下测试结果:
A:2 B:2 C:2
然后D的地址是4B对齐的,在mips下面测试结果跟PC x86一致,但是在arm9下面测试结果却差异很大:
A:4 B:4 C:2
然后D的地址有可能不是4B对齐的而且可能是奇数地址,那位高手能告诉原因,或者是否有规避的方法,当然不能用linux的强制4B对齐的__attribute__关键字等,因为我的代码是要求与平台无关的,最好是从编译器和编译选项上想。
我的ARM GCC版本:3.4.3
...全文
746 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
morris88 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 goodyun82 的回复:]
有时候会,比如你将char D[1024];的D去接收某些数据然后再将该数据格式化访问,就会出现不对齐的访问,比如:
struct S
{
int i;
int j;
int m;
int n;
};

struct S* p=(struct S*)D[0];
p->i=0x123456;

[/Quote]

貌似一般人都是这样写的(下述代码未经测试),以避免依赖于特定的编译器:
int off = D & 4;
struct S *p = (struct S *)&D[(4 - off) & 4];

goodluckyxl 2009-07-23
  • 打赏
  • 举报
回复
4和2字节可能是不同平台上为了优化做了一些特别处理
不会影响功能 只影响效率
一般网络传输都是使用单字节对齐方式
ddcien 2009-07-23
  • 打赏
  • 举报
回复
我的结果:
X86:

XXX@debian:~/test$ ./111
A:2 B:2 C:2
D's addr:0x8049760

ARM:

root@at91sam:~$ ./111_arm
A:2 B:2 C:2
D's addr:0x106b5

kdm528 2009-07-22
  • 打赏
  • 举报
回复
是影响空间占用吧
bugs2k0001 2009-07-22
  • 打赏
  • 举报
回复
没用过 arm 的 cpu,其他说的几种倒是用过。
static char D[1024];

不过,D 是不是 4 字节对齐很重要么?一般说来,ansi c/c++
没有定义具体实现。好像只是可能会影响一点儿性能吧。
goodyun82 2009-07-22
  • 打赏
  • 举报
回复
如果是非linux这种可以内核捕捉非对齐访问异常,并且fix的机制,其他系统直接死机。
goodyun82 2009-07-22
  • 打赏
  • 举报
回复
有时候会,比如你将char D[1024];的D去接收某些数据然后再将该数据格式化访问,就会出现不对齐的访问,比如:
struct S
{
int i;
int j;
int m;
int n;
};

struct S* p=(struct S*)D[0];
p->i=0x123456;
Behard 2009-07-22
  • 打赏
  • 举报
回复
如果为了跨平台,在定义结构体时请使用 8 Bytes 对齐方式。(64位CPU)
发现心流 2009-07-21
  • 打赏
  • 举报
回复
果真是编译选项?
goodyun82 2009-07-21
  • 打赏
  • 举报
回复
用-mabi=aapcs-linux链接选项可以得到A:2 B:2 C:2
的结果。
zhaofeng888 2009-07-20
  • 打赏
  • 举报
回复
确实如此啊
zhaofeng888 2009-07-20
  • 打赏
  • 举报
回复
我测了下,真的是这样哦
goodyun82 2009-07-18
  • 打赏
  • 举报
回复
顶上去。
once_and_again 2009-07-17
  • 打赏
  • 举报
回复
这里 没linux环境,不然 也一睹 这 奇怪 的 现象.
ShowMan 2009-07-17
  • 打赏
  • 举报
回复
的确瞒奇怪的
http://blog.csdn.net/ShowMan/archive/2009/07/17/4358435.aspx
goodyun82 2009-07-17
  • 打赏
  • 举报
回复
补充下,我编译的时候用的是g++

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧