VC++6.0中的一个奇怪的现象!哪位可以解释一下啦?
#include<iostream.h>
typedef struct A 

double x,y;
struct A *c ;
int i ;
}A;
void main()
{
A a;
cout<<"a array size is "<<sizeof(a) ;
}
//显示的结果:a array size is 24
//但为什么注释掉struct A *c ;这条语句还是a array size is 24,谁能给个说法吗?VC++为什么要//这样做
//它好象是按结构体中占空间最大的元素的类型为最小分配单位?????如上面这个程序中,double类//型占8个字节,则此结构体先分配X,在分配Y,在分配c,在分配i,则整个空间占8+8+4+4 = 24个字节,//但如果注释掉struct A *c也是24,先分配X,在分配Y,在分配c,由于c的占字节大小为4,相加后达不到//8的倍数,就让c占8个字节,达到8的倍数??是这样的吗?但如果这个结构体中的占空间最大的元素类//型和最小的元素类型的存储空间相差相大,这样的结构体的实例也很多个,那就不浪费了很多空间?
//不懂,望高手指点指点.

解决方案 »

  1.   

    就如楼主所说,去掉struct *a的声明后,因为要位对齐,所以后面的int 会分配8个字节
      

  2.   

    楼上的已经说了。是内存对齐问题。如果你把结构体里边的成员按占字节大小由小到大排列可以从表面上解决问题。
    也可以通过编译器中修改参数和用#pragma pack( [ n] )来解决(MSDN中可查)。
      

  3.   

    喔``  一知半解````heartbeast(水煮鱼) 
      虽然这会浪费一部分空间,但他可能会带来巨大的时间效益(相对于不对齐)。内存对齐与不对齐为何会影响它的时间效益?????
      

  4.   

    楼主,你已经自己解决了,去掉了struct A *c ,剩下的int i ;只是4,要解决内存对齐的问题,所以要分配8个的.