免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8130 | 回复: 12

[C++] 看看这个输出怎么回事? [复制链接]

论坛徽章:
0
发表于 2009-10-02 20:23 |显示全部楼层
10可用积分
#include "stdafx.h"
typedef union
{
    long i;
    int k[5];
    char c;
}date;
struct __trtt
{
    int m;
    date h;
    double b;
} too;

int main(int argc,char **argv)
{
    printf("%d\n",sizeof(too));

    return 0;
}



用vc6.0编译之后的输出是32,可是我认为结构体too的大小应该是date(sizeof(date)=20)的倍数啊,那么输出应该是32(4+20+8)+8(编译器填充的) =40啊,这里怎么会是32呢.....

[ 本帖最后由 sunyu_bit 于 2009-10-2 20:25 编辑 ]

最佳答案

查看完整内容

应该是按基本类型的大小,而不是构体大小来对齐的。这里最大的基本类型是 double, 所以按 8 字节对齐。

论坛徽章:
0
发表于 2009-10-02 20:23 |显示全部楼层
原帖由 sunyu_bit 于 2009-10-3 15:03 发表



那第二个是结构体,他的最大的成员占20字节,第二个总的大小应该是20的倍数吧,呵呵,这里怎么是32啊


应该是按基本类型的大小,而不是构体大小来对齐的。

这里最大的基本类型是 double, 所以按 8 字节对齐。

论坛徽章:
0
发表于 2009-10-02 20:53 |显示全部楼层
对齐?我没看代码,一猜就是对齐问题。

论坛徽章:
0
发表于 2009-10-02 21:48 |显示全部楼层

回复 #1 sunyu_bit 的帖子

int m, 4
date h,  取最大的, 4*5=20
double  8
4+20+8=32,看似很正常。

论坛徽章:
0
发表于 2009-10-02 22:18 |显示全部楼层
union是在4倍数对齐,而不是在20对齐。

论坛徽章:
0
发表于 2009-10-02 22:25 |显示全部楼层
原帖由 wings_in_wind 于 2009-10-2 21:48 发表
int m, 4
date h,  取最大的, 4*5=20
double  8
4+20+8=32,看似很正常。

这个好像还跟编译器有关的

论坛徽章:
0
发表于 2009-10-02 22:38 |显示全部楼层
默认情况下结构体一般都是按照4字节对齐的(大于4)

typedef struct a
{
   char b;
   char c;  
   char d;     
}CH;  //3

typedef struct a
{
   short b;
   char c;  
  // char d;     
}CH;  //4



你可以通过下面的方式修改
#pragma pack (n),C编译器将按照n个字节对齐。

__attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。

n = 1, 2, 4, 8, 16...较为常见。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
发表于 2009-10-02 23:13 |显示全部楼层
哈哈,就这么回事啊

论坛徽章:
0
发表于 2009-10-02 23:55 |显示全部楼层

回复 #6 ubuntuer 的帖子

嗯,是这样的

论坛徽章:
0
发表于 2009-10-03 10:13 |显示全部楼层
对齐?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP