问题如下:
struct A
{
double a;
int b;
int c;
int d;
double e;
}则struct A应该为28字节,但是sizeof(A)却为32字节,请问各位高手,这是什么问题引起的?

解决方案 »

  1.   

    sizeof(double)=12
    sizeof(int)=4
    12+4+4+4+12=32
    接分:)
      

  2.   

    编译器8位对齐,你看看VC的编译设置,缺省是8位。
    注意这样,对于CPU来说,存取起来效率更高
      

  3.   

    把分都给我吧!sizeof(struct )返回值应为8的倍数,不够的补上
      

  4.   

    在结构前面加上这个,1位对齐,就行了
    #pragma pack(push, 1)
    使用完,再恢复就可以了.
    #pragma pack(push, 8)
      

  5.   

    这问题我以前也遇过
    在结构体中,是按最大的sizeof()值*结构体的成员个数,你定义的结构体中,最大的sizeof()值为:
    sizeof(float)=8;成员个数为5,值应该为40吧.
      

  6.   

    RockHwnd(受不了?!怎么Hwnd=0阿?) 正解!关于sizeof使用的误区,在网上搜一片vc编程规范的文章,针对这个里边有详细的讲解
    不是ms的bug
      

  7.   

    默认按照 第一个 double 的8字节对齐,两个int用8字节。一个为了对齐也得 8字节 ,4字节浪费掉
    double a;  -------8字节
    int b;--------____8字节
    int c;--------
    int d;------------8字节
    double e;  -------8字节8 + 8 + 8 + 8 = 32 用wxdvc(csdn)的方法可避免这个
      

  8.   

    SORRY!!!!!!!!!!
    不同机子的float可能不同的,我的机子sizeof(float)=4;
      

  9.   

    跟编译器相关
    那整型来说,对不同的编译器,他的存储位数是不同的。有2byte,有4byte的。对于32位机器来说,现在大都是4byte.
    所以你得出的就是32了
      

  10.   


    字节对齐问题,改为以下代码看看,结果将会与你预测的一样!
    #pragma pack(push,MyStruct,1)
    struct A
    {
    double a;
    int b;
    int c;
    int d;
    double e;
    }
    #pragma pack(pop,MyStruct,1)
      

  11.   

    搂主看这儿:
    http://community.csdn.net/Expert/topic/3710/3710448.xml?temp=.3791468
      

  12.   

    为了更快的访问,采用的内存对齐的机制,不是什么Bug
      

  13.   

    stariver(银河孤星)正确!
    寒一下一楼的 RockHwnd,12+4+4+4+12 = 32????晕了吧!
    抢分也不要太激动了啊!
    呵呵,无恶意的说!
      

  14.   

    字节对齐问题
    struct A
    {
    double a; ==8 
    int b;
    int c;  ==8
    int d;
    double e; == 8+8
    }==32说明:int d;
    double e; == 8+8
    因为int + double =12 ,编译器默认为8字节对齐,所以就会在后面补4位,你可以直接看内存,马上就一清二楚了。加上这个#pragma pack(1),就会以1字节对齐,就是你的预期结果,不信你可以再弄别的结构体尝试一下。也可以直接设置,Project Setting -> C/C++ ->Code Generation -> Struct Menber Axxx....
      

  15.   

    #pragma pack(push)
    #pragma pack(1)typedef struct
    {
    unsigned int Total_Length; //消息总长度(含消息头及消息体)
    unsigned int Command_Id; //命令或响应类型
    unsigned int Sequence_Id; //消息流水号,顺序累加,步长为1,
    //循环使用(一对请求和应答消息的流水号必须相同)
    }cmpp_head;typedef struct
    {
    char Source_Addr[6]; //源地址,此处为SP_Id,即SP的企业代码。
    char AuthenticatorSource[16];//用于鉴别源地址。
    //其值通过单向MD5 hash计算得出,表示如下
    //AuthenticatorSource =MD5(Source_Addr+9 字节的0 +shared secret+timestamp)Shared secret 由中国移动与源地址实体事先商定,timestamp格式为:MMDDHHMMSS,即月日时分秒,10位。
    BYTE Version; //双方协商的版本号
    unsigned int Timestamp; //时间戳的明文
    }cmpp_connect_body;....#pragma pack(pop)
    ***********************
    以上就是我的程序里使用的结构对齐方法. 这样使用后就是你使用sizeof加起来的实际值.写网络通信程序用到结构的,一般都必须考虑结构对齐问题.
      

  16.   

    struct A
    {
    double a;
    double e;
    int b;
    int c;
    int d;
    }
    字节对齐的问题,写成这样就是28了。
      

  17.   

    回复人: stariver(银河孤星) ( ) 信誉:100  2005-01-26 16:22:00  得分: 0  
     
     
       默认按照 第一个 double 的8字节对齐,两个int用8字节。一个为了对齐也得 8字节 ,4字节浪费掉
    double a;  -------8字节
    int b;--------____8字节
    int c;--------
    int d;------------8字节
    double e;  -------8字节8 + 8 + 8 + 8 = 32 用wxdvc(csdn)的方法可避免这个
     
     
      

  18.   

    class my
    {
        my();
    }sizeof(my)==1;//虽然没有成员变量,类大小还是为1很多东西都不是如我们想象的那样
      

  19.   

    vc默认的是4字节对齐,可以通过#pragma pack(push)...来控制对齐方式
      

  20.   

    这个一定要留意,以前定义通信协议的时候就是.Windows会自动的帮你把这一些struct补成8字节对齐.所以,就在你定义struct的时候要把这个字节对齐数指定为1.#pragma pack(push, 1)用完之后就恢复#pragma pack(push, 8)
      

  21.   

    DentistryDoctor(雅克医生<改行做程序员了>)改了也不可以的,一个字节对齐的问题,注意设置避免,或者使用的时候留心就是啦
      

  22.   

    DentistryDoctor(雅克医生<改行做程序员了>) you are right!!
    up
    point :)
      

  23.   

    我来把它加到FAQ里去,200分太多了嘛!这样可要出乱了