文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>linux i386系统中struct 的数据对齐

linux i386系统中struct 的数据对齐

时间:2007-01-01  来源:todaygood

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

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

#include <stdio.h>
#include <sys/utsname.h>
#include <linux/types.h>

/*
 * 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
相关阅读 更多 +
排行榜 更多 +
武士刀之战

武士刀之战

休闲益智 下载
闲置肥皂切割

闲置肥皂切割

休闲益智 下载
大航海时代2

大航海时代2

休闲益智 下载