Chinaunix首页 | 论坛 | 博客
  • 博客访问: 294168
  • 博文数量: 59
  • 博客积分: 2021
  • 博客等级: 大尉
  • 技术积分: 491
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-29 09:49
文章分类

全部博文(59)

文章存档

2011年(6)

2010年(11)

2009年(42)

我的朋友

分类: LINUX

2009-08-02 23:01:24

gcc对齐规则(如果有什么错误,请高手指出):

(unsigned)char使用一字节对齐

int main(){
    typedef struct{char a;char b;char c;}node;
    printf("%d\n",sizeof(node));
    return 0;
}

上面的代码在linux下将打印 3 

任何2字节大小的数据类型(比如short)的对齐模数是2,

int main(){
    typedef struct{char a;short b;}node;
    printf("%d\n",sizeof(node));
    return 0;
}

上面的代码将打印 4.

而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。

int main(){
    typedef struct{char a;double b;char c;int d;short e;}node;
    printf("%d\n",sizeof(node));
    return 0;
}

上面的代码将打印 24

内存中存储图示为(括号内为占用字节数)

a(1)+填充(3)+b(8)+c(1)+填充(3)+d(4)+e(2)+填充(2)=24

很显然,这里有一个问题。即需要在最后填充字节满足某一个位数的倍数。这个位数就是数值中的最大字节数。上面的代码中结构node包含需要以4字节对齐的double和int类型。,所以short e后面需要填充两一个字节满足4的倍数。

int main(){
    typedef struct{char a;double b;char c;int d;short e;}node;
    typedef struct{char a;node b;short c;}node1;
    printf("%d\n",sizeof(node1));
    return 0;
}

上面的代码将打印 32.显然node也是以4字节对齐。

windows下对齐有些差异。大于等于8字节的数据类型使用8字节对齐。

所以上面的代码在windows下执行将输出48.

其中node在内存中的图示为

a(1)+fill(7)+b(8)+c(1)+fill(3)+d(4)+e(2)+fill(6)=32

node1在内存中的图示为

a(1)+fill(7)+b(32)+c(2)+fill(6)=48.

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