Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4562600
  • 博文数量: 385
  • 博客积分: 21208
  • 博客等级: 上将
  • 技术积分: 4393
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 13:40
文章分类

全部博文(385)

文章存档

2015年(1)

2014年(3)

2012年(16)

2011年(42)

2010年(1)

2009年(2)

2008年(34)

2007年(188)

2006年(110)

分类: LINUX

2007-01-01 14:51:40

在linux 系统中的应用程序,struct 并非是采用自然对齐,而是gcc强制对齐

何为自然对齐:在数据项大小的整数倍(例如:8字节数据项存入8的整数倍的地址)的地址处存储
                           数据项。

#include
#include
#include

/*
 * Define several data structures, all of them start with a lone char
 * in order to present an unaligned offset for the next field
 */
struct c   {char c;  char      t;} c;
struct s   {char c;  short     t;} s;
struct i   {char c;  int       t;} i;
struct l   {char c;  long      t;} l;
struct ll  {char c;  long long t;} ll;
struct p   {char c;  void *    t;} p;
struct u1b {char c;  __u8      t;} u1b;
struct u2b {char c;  __u16     t;} u2b;
struct u4b {char c;  __u32     t;} u4b;
struct u8b {char c;  __u64     t;} u8b;

int main(int argc, char **argv)
{
    struct utsname name;

    uname(&name); /* never fails :) */
    printf("arch  Align:  char  short  int  long   ptr long-long "
       " u8 u16 u32 u64\n");
    printf(       "%-12s  %3i   %3i   %3i   %3i   %3i   %3i      "
       "%3i %3i %3i %3i\n",
       name.machine,
       /* note that gcc can subtract void * values, but it's not ansi */
       (int)((void *)(&c.t)   - (void *)&c),
       (int)((void *)(&s.t)   - (void *)&s),
       (int)((void *)(&i.t)   - (void *)&i),
       (int)((void *)(&l.t)   - (void *)&l),
       (int)((void *)(&p.t)   - (void *)&p),
       (int)((void *)(&ll.t)  - (void *)&ll),
       (int)((void *)(&u1b.t) - (void *)&u1b),
       (int)((void *)(&u2b.t) - (void *)&u2b),
       (int)((void *)(&u4b.t) - (void *)&u4b),
       (int)((void *)(&u8b.t) - (void *)&u8b));
    return 0;
}

[root@hujunlinux driver_pratice]# ./dataalign
arch  Align:  char  short  int  long   ptr long-long  u8 u16 u32 u64
i686                  1     2          4     4     4     4               1   2     4      4

可见最大的对齐单位是4




int main()
{      
        struct A{  char c;
                   long long  b;
                }one;
               
        printf("sizeof(one)=%d,sizeof(c)=%d\n",sizeof(one),
        (int)((void*)(&(one.b))-(void*)(&one))
        );
       
       
        return 0;

}
 ./charSize
sizeof(one)=12,sizeof(c)=4


int main()
{      
        struct A{  char c;
                 short  b;
                }one;
               
        printf("sizeof(one)=%d,sizeof(c)=%d\n",sizeof(one),
        (int)((void*)(&(one.b))-(void*)(&one))
        );
       
       
        return 0;

}

./charSize
sizeof(one)=4,sizeof(c)=2


int main()
{      
        struct A{  char c;
                   int  b;
                }one;
               
        printf("sizeof(one)=%d,sizeof(c)=%d\n",sizeof(one),
        (int)((void*)(&(one.b))-(void*)(&one))
        );
       
       
        return 0;

}
./charSize
sizeof(one)=8,sizeof(c)=4





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