文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>gcc的对齐方式

gcc的对齐方式

时间:2009-08-02  来源:liningMCU

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.

排行榜 更多 +
越野普拉多停车

越野普拉多停车

赛车竞速 下载
高速公路恐惧

高速公路恐惧

赛车竞速 下载
人群大炮

人群大炮

飞行射击 下载