分类: C/C++
2008-10-30 16:24:37
|
但是打印出来的结果是
真机:AlignFoo: size 36 memory 706110 706114 706118 706109 706121 706122
emulator: AlignFoo: size 36 memory 20c72700 20c72704 20c72708 20c72709 20c72711 20c72712
说明要么我没有用对pack,要么
1.pack对emulator上不起作用
2.arm上也不是对char做数据对齐的;在真机上我视图通过用TUint指针来修改cc8[8]的值,返回Kern-exec 3的错误,因为cc8[8]不是4字节对齐的!
现在我将AlignFoo声明改为
|
在真机上运行:packed使用最小的内存模式,所有成员以字节对齐!
AlignFoo: size 32 memory 706110 706111 706115 706116 70611e 70611f
变成了所有成员1字节对齐了!最后大小变为了32 当然用TInt指针去访问706116仍然失败。
emulator上没什么变化!
#define PACKED __attribute__((aligned(n))) n = 2 和 n = 4的结果没什么区别!
将代码修改为: char cc8[8] __attribute__((aligned(4))); 或者 __attribute__((aligned(4))) char cc8[8]; 然后运行真机得到的效果是:
AlignFoo: size 40 memory 708538 70853c 708540 708544 70854c 70854d
我们看到cc8终于以4字节方式对齐了,可以通过TInt指针来修改它了!ffmpeg用到了这种方式来快速访问内存!
|
在真机上得到AlignFoo: size 48 memory 708538 70853c 708540 708548 708550 708558
看到最后cc16并没有16字节对齐,看来symbian gcce支持1 2 4 8字节对齐!
在模拟器上得到的结果如下:
AlignFoo: size 48 memory 20c62700 20c62704 20c62708 20c62710 20c62718 20c62720
原来在模拟器上也可以用__attribute__((aligned(16)))
所以,最开始在网上查询到的有一定出入。 Just do it by you self!