Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318724
  • 博文数量: 88
  • 博客积分: 2051
  • 博客等级: 大尉
  • 技术积分: 950
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 23:59
文章分类

全部博文(88)

文章存档

2012年(3)

2011年(2)

2010年(9)

2009年(14)

2008年(60)

我的朋友

分类: C/C++

2008-10-30 16:24:37

很是恼火的一个话题!请直接看最后红色部分
 
我搞了半天了,还是没有结论
首先声明一个结构体,我希望每个成员都自动4字节对齐!
 

#pragma pack(push,4)

typedef struct AlignFoo
{

    char c;
    TInt i;
    char c8;
    char cc8[8];
    char c16;
    char cc16[16];
}AlignFoo;

#pragma pack()

但是打印出来的结果是

真机: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声明改为

 

#if defined(__WINS__)
#define PACKED
#else
#define PACKED __attribute__((packed))
#endif

#pragma pack(push,4) //gcce compiler ignore this line
typedef struct AlignFoo
{
    char c;
    TInt i;
    char c8;
    char cc8[8];
    char c16;
    char cc16[16];
}PACKED AlignFoo;
#pragma pack()

在真机上运行: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用到了这种方式来快速访问内存!

 

typedef struct AlignFoo
{
    char c;
    TInt i;    
    char c8;
    __attribute__((aligned(8))) char cc8[8];    
    char c16;
     __attribute__((aligned(16))) char cc16[16];
}PACKED AlignFoo;

在真机上得到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!

阅读(1197) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~